2012-02-17 153 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