2012-02-17 202 views
0

我正在嘗試使用Dependency屬性和使用RegisterInstance。我讀過如果我使用RegisterInstance,我必須在實例上使用BuildUp方法。不幸的是,它不能在我的代碼中工作。它不能解析Alarm屬性。當我使用我的代碼沒有RegisterInstance一切正常,但我需要使用RegisterInstance。我想念什麼?BuildUp無法解決依賴關係

編輯

var container = new UnityContainer(); 
container.RegisterType<IAlarm, Alarm>(); 

ICar car = new Car(); 
container.RegisterInstance<ICar>(car); 
var carFromContainer = container.BuildUp<ICar>(container.Resolve<ICar>()); 
var alarm = carFromContainer.Alarm; 

public interface ICar 
{ 
    IAlarm Alarm { get; set; } 
} 

public class Car : ICar 
{ 
    private IAlarm _alarm; 

    [Dependency] 
    public IAlarm Alarm 
    { 
     get { return _alarm; } 
     set { _alarm = value; } 
    } 
} 

public interface IAlarm 
{ 
    void Launch(); 
} 

public class Alarm : IAlarm 
{ 
    public void Launch() 
    { 
     Console.WriteLine("Alarm !"); 
    } 
} 

老例如

var container = new UnityContainer(); 
container.RegisterType<IAlarm, Alarm>(); 
ICar car = new Car(); 
container.RegisterInstance<ICar>(car); 

//container.RegisterType<ICar, Car>(); 

var client = new Client(container); 
var alarm = client.Car.Alarm; 
client.Car.Alarm.Launch(); 

public class Client 
{ 
    public ICar Car { get; set; } 
    public Client(UnityContainer container) 
    { 
     //Car = container.Resolve<ICar>(); 
     Car = container.BuildUp<ICar>(container.Resolve<ICar>()); 
    } 
} 


public interface ICar 
{ 
    IAlarm Alarm { get; set; } 
} 

public class Car : ICar 
{ 
    private IAlarm _alarm; 

    [Dependency] 
    public IAlarm Alarm 
    { 
     get { return _alarm; } 
     set { _alarm = value; } 
    } 
} 

public interface IAlarm 
{ 
    void Launch(); 
} 

public class Alarm : IAlarm 
{ 
    public void Launch() 
    { 
     Console.WriteLine("Alarm !"); 
    } 
} 

回答

2

我不明白你的示例代碼。您自己新增了Car並將其註冊到容器中。然後您告訴容器將IAlarm映射到執行類Alarm。然後你將容器注入你的Client,這是一個強烈的不鼓勵。絕不能在應用程序的Composition root之外引用DI容器。然後你(ab)使用你的容器作爲ServiceLocator(它被認爲是anti-pattern in modern application architecture)來解決ICar併爲屬性注入一些值。

我會建議你重新考慮一下你的設計,而不是尋找你面對的技術問題的解決方案。


UPDATE

更改ICar您的接口定義,把DependencyAttribute存在和它的作品。

但我不能推薦這種方法。 DI attributes should not polute your code

+0

塞巴斯蒂安,你是絕對正確的。我贊同你。但這只是一個例子,儘可能簡單。在我的真實應用程序中,我遵循您列出的良好做法我編輯我的帖子給出更清晰的例子。 – user278618 2012-02-17 10:43:29

+0

@ user278618我更新了我的回答 – 2012-02-17 11:18:08

+0

太棒了,它工作:)但你的鏈接更好。 – user278618 2012-02-17 12:00:49