簡體   English   中英

Unity .NET:依賴項列表

[英]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會將此容器中定義的所有此類對象注入其中。

是的,你可以..你可以看看依賴注射器。 我是Autofac項目的忠實粉絲。

另一種選擇是Ninject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM