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
放在那里,它就可以工作了
但我也不能推荐这种方法 塞巴斯蒂安,你完全正确。我同意你的看法。但这只是一个尽可能简单的例子。在我的实际应用中,我遵循您列出的良好实践。我编辑了我的帖子,给出了更清晰的例子。