C# 堆积物不';无法解决依赖关系

C# 堆积物不';无法解决依赖关系,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我正在尝试将依赖关系属性与使用注册表状态一起使用。我已经读到,如果我使用RegisterInstance,我必须在实例上使用build方法。不幸的是,它在我的代码中不起作用。它不解析报警属性。当我在没有注册状态的情况下使用代码时,一切都正常,但我需要使用注册状态。我错过什么了吗 编辑 var container = new UnityContainer(); container.RegisterType<IAlarm, Alarm>(); ICar car = new Car();

我正在尝试将
依赖关系
属性与使用
注册表状态
一起使用。我已经读到,如果我使用
RegisterInstance
,我必须在实例上使用
build
方法。不幸的是,它在我的代码中不起作用。它不解析
报警
属性。当我在没有注册状态的情况下使用代码时,一切都正常,但我需要使用注册状态。我错过什么了吗

编辑

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=newunitycontainer();
container.RegisterType();
ICar汽车=新车();
集装箱登记站(car);
var carFromContainer=container.build(container.Resolve());
var报警=carFromContainer.alarm;
公共接口ICar
{
IAlarm报警{get;set;}
}
公车:ICar
{
私人警报;
[依赖性]
公共警报
{
获取{return\u alarm;}
设置{u报警=值;}
}
}
公共接口IAlarm
{
无效发射();
}
公共类警报:IAlarm
{
公开发售()
{
控制台。写线(“报警!”);
}
}
旧示例

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 !");
    }
}
var container=newunitycontainer();
container.RegisterType();
ICar汽车=新车();
集装箱登记站(car);
//container.RegisterType();
var客户端=新客户端(容器);
var报警=client.Car.alarm;
client.Car.Alarm.Launch();
公共类客户端
{
公共ICar车辆{get;set;}
公共客户端(UnityContainer容器)
{
//Car=container.Resolve();
Car=container.build(container.Resolve());
}
}
公共接口ICar
{
IAlarm报警{get;set;}
}
公车:ICar
{
私人警报;
[依赖性]
公共警报
{
获取{return\u alarm;}
设置{u报警=值;}
}
}
公共接口IAlarm
{
无效发射();
}
公共类警报:IAlarm
{
公开发售()
{
控制台。写线(“报警!”);
}
}

我不理解您的示例代码。您可以自己重新安装
Car
并将其注册到容器中。然后告诉容器将
IAlarm
映射到实现类
Alarm
。然后将容器注入
客户机
,这是非常不受欢迎的。决不能在应用程序的外部引用DI容器。然后,您(ab)将容器用作ServiceLocator(被认为是一个)来解析
ICar
,并向属性中注入一些值

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


更新

更改
ICar
的接口定义,并将
DependencyAttribute
放在那里,它就可以工作了


但我也不能推荐这种方法

塞巴斯蒂安,你完全正确。我同意你的看法。但这只是一个尽可能简单的例子。在我的实际应用中,我遵循您列出的良好实践。我编辑了我的帖子,给出了更清晰的例子。