![](/img/trans.png)
[英]Including Dependencies That Target .NET 4.x in Travis While Using Unity
[英]Unity .NET: List of dependencies
是否可以在Unity或其他類型的IoC庫中注入這樣的依賴項列表 ?
public class Crawler
{
public Crawler(IEnumerable<IParser> parsers)
{
// init here...
}
}
通過這種方式,我可以在我的容器中注冊多個IParser,然后解決它們。
可能嗎? 謝謝
這是可能的,但您需要應用一些變通方法。 首先,您需要在Unity容器中使用名稱注冊每個IParser 。 其次,您需要在容器中注冊從IParser []到IEnumerable <IParser>的映射。 否則,容器無法將解析器注入構造函數。 以下是我以前的做法。
IUnityContainer container = new UnityContainer();
container.RegisterType<IParser, SuperParser>("SuperParser");
container.RegisterType<IParser, DefaultParser>("DefaultParser");
container.RegisterType<IParser, BasicParser>("BasicParser");
container.RegisterType<IEnumerable<IParser>, IParser[]>();
container.RegisterType<Crawler>();
Crawler crawler = container.Resolve<Crawler>();
我通過引入一個工廠來廢棄這個解決方案,這個工廠封裝了統一來構建所需的類型。 以下是我將如何處理你的情況。
public interface IParserFactory{
IEnumerable<IParser> BuildParsers();
}
public class UnityParserFactory : IParserFactory {
private IUnityContainer _container;
public UnityParserFactory(IUnityContainer container){
_container = container;
}
public IEnumerable<IParser> BuildParsers() {
return _container.ResolveAll<IParser>();
}
}
public class Crawler {
public Crawler(IParserFactory parserFactory) {
// init here...
}
}
有了這個,你可以注冊類型如下:
IUnityContainer container = new UnityContainer();
container.RegisterType<IParser, SuperParser>();
container.RegisterType<IParser, DefaultParser>();
container.RegisterType<IParser, BasicParser>();
container.RegisterType<IParserFactory, UnityParserFactory>();
Crawler crawler = container.Resolve<Crawler>();
並不是說我說這是錯的,但似乎你正在嘗試解決一個插件模型,你可以通過使用MEF來輕松管理。 提示將被繼承從界面導出,然后在需要解析器時執行ImportMany。
事實上,我不知道任何不支持這個的容器。
但是,作為一般建議,如果可以,可以通過將該列表包裝在組合中 ,並將該組合注入到使用者中來防止將服務列表注入到使用者中。 不將列表包裝在復合中會使應用程序混亂使用額外的foreach
循環,或者您需要做什么來處理該依賴項列表。 雖然這似乎並不壞,但這些依賴關系的消費者不應該關心。 但更糟糕的是,當我們想要改變處理服務列表的方式時,我們將不得不通過完整的應用程序,這違反了DRY原則。
當消費者(在您的情況下是Crawler
)是Composition Root的一部分而不是應用程序本身時,此建議不成立。 此外,當應用程序只有一個消費者接受這種依賴時,它可能不是那么大的交易。
有很多方法可以在Unity中實現這一目標。 例如,
http://sharpsnmplib.codeplex.com/SourceControl/changeset/view/5497af31d15e#snmpd%2fapp.config
<register type="UserRegistry">
<lifetime type="singleton" />
<constructor>
<param name="users" dependencyType="User[]" />
</constructor>
</register>
此構造函數需要一個User對象數組,並且在創建UserRegistry對象時,Unity會將此容器中定義的所有此類對象注入其中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.