2009-12-28 30 views
4

期間指定的依賴名字我下面的代碼片段:統一:配置

static void Main(string[] args) { 
    var container = new UnityContainer(); 
    container.RegisterType<IConnection, SerialPortConnection>("SerialConnection"); 
    container.RegisterType<IConnection, ParallelPortConnection>("ParallelConnection"); 
    container.RegisterType<Device>("ParallelDevice"); 
    container.RegisterType<Device>("SerialDevice"); 
} 

我想在兩個不同的名字來註冊類型Device,使取決於名稱請求Device實例將適當Connection進行初始化。以下是解決此問題的一種方法,僅供演示:

public class ParallelDevice : Device { 
    public ParallelDevice([Dependency("ParallelConnection")] IConnection connection) : base(connection) {} 
} 
public class SerialDevice : Device { 
    public SerialDevice([Dependency("ParallelConnection")] IConnection connection) : base(connection) {} 
} 

// and register with 
container.RegisterType<Device, ParallelDevice>("ParallelDevice"); 
container.RegisterType<Device, SerialDevice>("SerialDevice"); 

有沒有更好的方法來做到這一點?喜歡的東西:

container.RegisterType<Device>("ParallelDevice").UseDependencyNames("ParallelConnection"); 

回答

2

你可以這樣說:

var container = new UnityContainer() 
    .RegisterType<IConnection, SerialConnection>("SerialConnection") 
    .RegisterType<Device, SerialDevice>(new InjectionConstructor(
     new ResolvedParameter<IConnection>("SerialConnection"))); 

或像這樣:

container 
    .Configure<InjectedMembers>() 
    .ConfigureInjectionFor<ParallelDevice>(new InjectionConstructor(
     new ResolvedParameter<IConnection>("ParallelConnection"))); 

This article有更多的例子,以及一些擴展團結,讓您寫這樣的測試:

[Test] 
public void Should_inject_named_instance_of_encryption_provider() 
{ 
    var service = container.Resolve<MyService>(); 

    AssertNamedInstanceWasResolved<IEncryptionProvider>("MyEncryptionProvider"); 
} 
4

您應該努力保持您的代碼不含DI容器特定的代碼。在這種情況下,你可以簡單地定義你的設備而不需要引用Unity。這裏的SerialDevice作爲一個例子,但ParallelDevice類是完全相似的:

public class SerialDevice : Device 
{ 
    public SerialDevice(IConnection connection) 
     : base(connection) { } 
} 

你可以配置你的容器是這樣的:

container.RegisterType<IConnection, SerialPortConnection>("SerialConnection"); 
container.RegisterType<IConnection, ParallelPortConnection>("ParallelConnection"); 
container.RegisterType<Device, SerialDevice>("SerialDevice", 
    new InjectionConstructor(new ResolvedParameter<IConnection>("SerialConnection"))); 
container.RegisterType<Device, ParallelDevice>("ParallelDevice", 
    new InjectionConstructor(new ResolvedParameter<IConnection>("ParallelConnection"))); 

這將允許您解決這樣既設備對象:

var serialDevice = container.Resolve<Device>("SerialDevice"); 
var parallelDevice = container.Resolve<Device>("ParallelDevice");