2015-11-06 39 views
1

我有一個類有一個構造函數,需要孩子接口的集合如何使用Unity解析一組接口?

public class Manager : IManager 
{ 
    public Manager(IEnumerable<IDataAccess> dataAccess) 
    { 

IDataAccess是一個基本接口

public interface IFooDataAccess : IDataAccess 
{ 

public interface IBarDataAccess : IDataAccess 
{ 

public interface IBazDataAccess : IDataAccess 
{ 

有對於這些具體實現。 當我解析IManager時,我想讓dataAccess參數填充FooDataAccess,BarDataAccess和BazDataAccess的集合。

我使用統一作爲一個IoC,目前登記:

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterTypes(AllClasses.FromAssemblies(
       typeof(IManager).Assembly), 
      WithMappings.FromMatchingInterface, 
      WithName.Default, 
      WithLifetime.ContainerControlled); 

我有在溶液中的幾個其他類太(因此使用註冊圖案),所以我想保持這個。我一直在試圖自己註冊IManager:

 var allDataAccesses = container.ResolveAll<IDataAccess>(); 
     var parameter = new InjectionConstructor(allDataAccesses); 
     container.RegisterType<IManager, Manager>(parameter); 

但我不能得到它的工作,我錯過了什麼。我如何配置統一來解析構造函數?

回答

4

您所做的註冊將映射直接實現的接口,而不是IDataAccess

例如,它會將IFooDataAccess映射到FooDataAccess。您需要的是例如將IDataAccess映射到FooDataAccess

爲了解決這一點,添加以下注冊碼:

container.RegisterTypes(
    typeof (IManager) 
     .Assembly 
     .GetTypes() 
     .Where(x => x.IsClass) 
     .Where(x => typeof (IDataAccess).IsAssignableFrom(x)), 
    x => new[] {typeof (IDataAccess)}, 
    WithName.TypeName, WithLifetime.ContainerControlled); 

這將搜索組件,用於實現IDataAccess(直接或間接)類,以及將創建IDataAccess和這些類之間的映射。

這裏要注意的一件重要事情是,它給了註冊一個名字。這很重要,因爲如果將接口IDataAccess映射到許多類,則不能使用默認名稱。團結將如何知道使用哪個地圖條目?

你需要做的另一件事是映射到IEnumerable<IDataAccess>IDataAccess[]這樣的:

container.RegisterType<IEnumerable<IDataAccess>, IDataAccess[]>(); 

統一知道如何通過查看所需的接口命名註冊來解決陣列。它不能默認爲IEnumerable<T>做同樣的事情。替代方案是將構造函數更改爲使用如下所示的數組:

public class Manager : IManager 
{ 
    public Manager(IDataAccess[] dataAccess) 
    { 
     .... 
    } 

    .... 
} 
相關問題