C# 使用Unity应用程序块创建对象

C# 使用Unity应用程序块创建对象,c#,wpf,dependency-injection,inversion-of-control,unity-container,C#,Wpf,Dependency Injection,Inversion Of Control,Unity Container,我目前正在阅读Microsoft Unity应用程序块,以便在我的一个个人项目中使用它。我读过几篇关于它的文章和教程,但我有一个问题 在中,它们使用Unity来创建继承IVehicle接口的对象。这3个继承自它的类没有任何必须在构造函数中初始化的属性,因此一切都很好 显然,在我的项目中,情况并非总是如此。我将有一些类确实需要在构造函数中初始化属性(或字段)。我的问题是,我将如何实现这一目标?或者是统一本身无法做到的事情;我必须使用Unity的Resolve()函数创建对象,该函数将为我提供一个具

我目前正在阅读Microsoft Unity应用程序块,以便在我的一个个人项目中使用它。我读过几篇关于它的文章和教程,但我有一个问题

在中,它们使用Unity来创建继承
IVehicle
接口的对象。这3个继承自它的类没有任何必须在构造函数中初始化的属性,因此一切都很好


显然,在我的项目中,情况并非总是如此。我将有一些类确实需要在构造函数中初始化属性(或字段)。我的问题是,我将如何实现这一目标?或者是统一本身无法做到的事情;我必须使用Unity的
Resolve()
函数创建对象,该函数将为我提供一个具有未初始化字段/属性的对象,然后我必须在每个字段/属性上逐个调用setter?

Unity支持自动关联,允许您解析复杂的对象图,而不仅仅是单个对象

例如,假设您有一个类
Car
实现
ICar
,它依赖于使用构造函数注入的另一个类
IEngine
(Car的构造函数需要一个类型为IEngine的参数)

然后,您将在Unity中注册如何解析
ICar
IEngine

var _container = new UnityContainer()   
                    .RegisterType<ICar,Car>()
                    .RegisterType<IEngine,Engine>(
                          new InjectionProperty("Message", "Hello world"));
你好,世界

通过解析
ICar
Unity,可以获得所需的完整对象图。你可以试试这个样品

编辑

您可以使用将在运行时执行的lambda方法注册要解析的类型,例如:

public interface IFoo
{
    DateTime ResolvedTime {get; set;}
}

public class Foo: IFoo
{
    public DateTime ResolvedTime {get; set;}
}

//Can be registered using a lambda as in:
container.RegisterType<IFoo,Foo>(
             new InjectionFactory(c => new Foo{ ResolvedTime = DateTime.Now }));
公共接口IFoo
{
DateTime ResolvedTime{get;set;}
}
公共类Foo:IFoo
{
公共日期时间解析时间{get;set;}
}
//可以使用lambda注册,如中所示:
container.RegisterType(
新注入工厂(c=>newfoo{ResolvedTime=DateTime.Now});

你可以得到一些信息。我还用这个lambda示例更新了上面的提琴。

您的回答帮助我更好地理解。但是,如果说,
引擎
需要一条
消息
,我只能在以后的解析时间提供,而我在应用程序开始时的注册时间不知道这条
消息
,会发生什么呢?Unity对我来说似乎非常有限,因为在注册对象时,必须在应用程序的一开始就为构造函数、所有属性等提供所有参数。除非我仍然缺少什么?您还可以使用将在运行时执行的lambda注册类型。如果这还不够,那么您可以创建一个抽象的工厂接口,比如
ICarFactory
,这样一些类就可以依赖于这个工厂并调用类似carFactory.CreateCar()的东西除了直接依赖于
ICar
之外,你能给出一个例子,使用Unity和lambda表达式在上面的答案中注册一个类型吗?或者给我指一份文档?
var car = _container.Resolve<Car>();
car.Accelerate();
public interface IFoo
{
    DateTime ResolvedTime {get; set;}
}

public class Foo: IFoo
{
    public DateTime ResolvedTime {get; set;}
}

//Can be registered using a lambda as in:
container.RegisterType<IFoo,Foo>(
             new InjectionFactory(c => new Foo{ ResolvedTime = DateTime.Now }));