BuildUp不解析依赖关系

时间:2012-02-17 09:30:09

标签: c# dependency-injection unity-container

我正在尝试使用Dependency属性并使用RegisterInstance。我已经读过如果我使用RegisterInstance我必须在实例上使用BuildUp方法。不幸的是它在我的代码中不起作用。它不解析Alarm属性。当我使用没有RegisterInstance的代码时,一切正常,但我需要使用RegisterInstance。我想念一下吗?

修改

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 !");
    }
}

1 个答案:

答案 0 :(得分:2)

我不明白你的示例代码。您自己新建Car并将其注册到容器中。然后告诉容器将IAlarm映射到实现类Alarm。然后你将容器注入你的Client,这是一个非常不赞成的东西。永远不要在应用程序的Composition root之外引用DI容器。然后你(ab)使用你的容器作为ServiceLocator(被认为是anti-pattern in modern application architecture)来解析ICar并将一些值注入属性。

我建议您重新考虑您的设计,而不是寻找您所面临的技术问题的解决方案。


<强>更新

更改ICar的界面定义,并将DependencyAttribute放在那里,然后就可以了。

但我不能推荐这种方法。 DI attributes should not polute your code