1

我使用統一作爲我的IoC容器。我正在嘗試實現一種IProviderRepository。具體的實現有一個接受一種IRepository的構造函數。當我從具體實現中刪除構造函數參數時,一切正常。我確定容器連線正確。當我嘗試創建我收到以下錯誤構造具體對象:統一和對象創建

"The current build operation (build key Build Key[EMRGen.Infrastructure.Data.IRepository 1[EMRGen.Model.Provider.Provider], null]) failed: The current type, EMRGen.Infrastructure.Data.IRepository 1[EMRGen.Model.Provider.Provider], is an interface and cannot be constructed. Are you missing a type mapping? (Strategy type BuildPlanStrategy, index 3)".

是否有可能實現與團結上面提到的功能?也就是讓Unity從Interface中推斷出一個具體類型,並根據構造函數參數將具體類型的構造函數注入適當的具體對象中。下面是我在Unity中定義的類型示例以及我想要實現的骨架類列表。 IProviderRepository由ProviderRepository實現,它有一個構造函數,需要一個IRepository類型。

<typeAlias alias="ProviderRepositoryInterface" type="EMRGen.Model.Provider.IProviderRepository, EMRGen.Model" /> 
<typeAlias alias="ProviderRepositoryConcrete" type="EMRGen.Infrastructure.Repositories.Providers.ProviderRepository, EMRGen.Infrastructure.Repositories" /> 
<typeAlias alias="ProviderGenericRepositoryInterface" type="EMRGen.Infrastructure.Data.IRepository`1[[EMRGen.Model.Provider.IProvider, EMRGen.Model]], EMRGen.Infrastructure" /> 
<typeAlias alias="ProviderGenericRepositoryConcrete" type="EMRGen.Infrastructure.Repositories.EntityFramework.ApplicationRepository`1[[EMRGen.Model.Provider.Provider, EMRGen.Model]], EMRGen.Infrastructure.Repositories" /> 
<!-- Provider Mapping--> 
<typeAlias alias="ProviderInterface" type="EMRGen.Model.Provider.IProvider, EMRGen.Model" /> 
<typeAlias alias="ProviderConcrete" type="EMRGen.Model.Provider.Doctor, EMRGen.Model" /> 

說明呼叫被我班內做:

public class PrescriptionService 
{ 
    PrescriptionService() 
    { 
     IUnityContainer uc = UnitySingleton.Instance.Container; 
     UnityServiceLocator unityServiceLocator = new UnityServiceLocator(uc); 
     ServiceLocator.SetLocatorProvider(() => unityServiceLocator); 
     IProviderRepository pRepository = 
      ServiceLocator.Current.GetInstance<IProviderRepository>(); 
    } 
} 

public class GenericRepository<IProvider> : IRepository<IProvider> 
{ 
} 

public class ProviderRepository : IProviderRepository 
{ 
    private IRepository<IProvider> _genericProviderRepository; 

    //Explict public default constructor 
    public ProviderRepository(IRepository<IProvider> genericProviderRepository) 
    { 
     _genericProviderRepository = genericProviderRepository; 
    } 
} 

回答

2

你想要做什麼是可能的,但你需要告訴團結如何地圖從接口到具體類型。 AFAICT,您當前的配置會記錄很多類型,但不會指定它們之間的相互關係。

那就是說,static Service Locator is an anti-pattern。考慮改變你的代碼來改爲使用合適的構造器注入。這也將極大簡化了你的代碼:

public class PrescriptionService 
{ 
    private readonly IProviderRepository pRepository; 

    public PrescriptionService(IProviderRepository pRepository) 
    { 
     if (pRepository == null) 
     { 
      throw new ArgumentNullException("pRepository"); 
     } 

     this.pRepository = pRepository; 
    } 
} 

使用Unity,你將能夠連線起來是這樣的:

var container = new UnityContainer(); 
container.RegisterType<PrescriptionService>(); 
container.RegisterType<IProviderRepository, ProviderRepository>(); 
container.RegisterType<IRepository<IProvider>, MyRepository<IProvider>>(); 

var ps = container.Resolve<PrescriptionService>(); 

配置容器和resolve all components in the application's Composition Root

您應該only use XML configuration if you need to be able to change certain components without recompiling your application