2010-06-23 23 views
6

如何配置Unity,以便從某個基類派生的任何類都將通過爲基類定義的注入管道。爲某些基類的所有後代配置Unity注入

public abstract class Base 
{ 
    public IDependency Dependency {get;set;} 
}; 

public class Derived1: Base 
{ 
}; 

public class Derived2: Base 
{ 
}; 


container.RegisterType<Base>(new InjectionProperty("Dependency", new ResolvedParameter<IDependency>())); 
var d1 = container.Resolve<Derived1>(); 

因此,我需要寄存器基類與統一而決心派生類使得對於基類指定的所有注射將適用於派生類。

由於我的項目限制,不允許使用DependencyAttribute修飾基類屬性。


Mirror of the question on Unity's codeplex site

+2

你在找什麼叫*自動註冊*,*掃描*或*基於會議的註冊*。許多DI容器(如Castle Windsor和StructureMap)都支持這一點,但Unity不支持。我可以推薦一個更好的DI容器嗎? – 2010-06-23 06:54:56

+0

謝謝,但恐怕現在不可能切換到另一個DI框架。其實,我正在尋找聰明的BuildUp,而不是自動註冊所有的後代。當然,自動註冊也可以讓我實現我的目標。但考慮繼承問題會更合適我的想法。 – 2010-06-23 07:05:49

+0

也許你會發現這個相關的問題(及其答案)很有用:http://stackoverflow.com/questions/1769056/does-ms-pnp-unity-scan-for-assemblies-like-structuremap – 2010-06-23 08:28:46

回答

6
var container = new UnityContainer(); 
container 
    .RegisterType<IDependency, Dependency1>() 
    .RegisterTypes(
     AllClasses 
      .FromAssemblies(Assembly.GetExecutingAssembly()) 
      .Where(t => typeof(Base).IsAssignableFrom(t)), 
     getInjectionMembers: _ => new[] { new InjectionProperty("Dependency") }); 
var d1 = container.Resolve<Derived1>(); 

注:需要統一3支持Registration by convention

+0

2010年我在做這個夢:) – 2013-09-04 11:39:19

相關問題