[英]Castle.Windsor CollectionResolver and Ordering of Components
我們使用Castle.Windsor(3.1)中的CollectionResolver注入一組組件。 這些順序是相關的。 當前,我們在服務上使用Position屬性來訂購它們。
因為我們在具有不同組件集的不同應用程序中使用相同的主組件,所以位置屬性是維護負擔。 它意味着彼此之間的組件的知識。 同樣,單個組件也不應該了解其他組件。
我們想要類似為特定服務類型注冊多個IComparer<Type>
,以控制注入組件的順序。
在Castle.Windsor中是否有一種簡單的(預定義)方法來執行此操作,或者之前有人進行過此類操作?
我們要替換的示例:
interface IService
{
bool Do();
int Position { get; } // <= This should be kicked!
}
class Master
{
private readonly IService[] _services;
public Master(IService[] services)
{
// Master should not care about ordering also,
// but injecting a sorter would be acceptable
_services = services.OrderBy(s => s.Position).ToArray();
}
public void Do()
{
foreach(var service in _services)
{
if(!service.Do())
break;
}
}
}
我們想要這樣的東西,而沒有使用這樣的組件的Position:
class OrderService : IComparer<Type>
{
public int Compare(Type x, Type y)
{
if(typeof(MoreImportantComponent) == x)
return -1;
else
return 0;
}
}
您可以使用IHandlersFilter
實現影響服務的順序
public class ServiceHandlersFilter : IHandlersFilter
{
private readonly List<Type> sortOrder = new List<Type>
{
{ typeof(Service1) },
{ typeof(Service2) },
{ typeof(Service3) },
};
public bool HasOpinionAbout(Type service)
{
return service == typeof(IService);
}
public IHandler[] SelectHandlers(Type service, IHandler[] handlers)
{
return handlers
.OrderBy(h => sortOrder.IndexOf(h.ComponentModel.Implementation))
.ToArray();
}
}
您可能希望更優雅地確定排序順序,例如,由組件本身確定。 如果是這種情況,請檢查此RespectOrderDirectivesHandlersFilter
實現。 根據過濾器上mookid的博客文章 ,您可以使用ExecutesBeforeAttribute
和ExecutesAfterAttribute
屬性來為IService
實現賦予屬性,以暗示彼此執行的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.