C# 指定要使用的Unity IoC容器的构造函数
我正在使用Unity IoC容器解析我的对象。然而,我遇到了一个问题。当我有多个构造函数时,Unity如何知道使用哪一个?当我有一个带参数的和一个不带参数的时,它似乎使用了一个带参数的。我可以明确地告诉它使用哪个构造函数吗 具体来说,我有一个类似于下面的Person类的案例,有两个构造函数。在本例中,我希望IoC容器使用默认构造函数(不带参数),但它选择带参数的构造函数C# 指定要使用的Unity IoC容器的构造函数,c#,.net,unity-container,ioc-container,C#,.net,Unity Container,Ioc Container,我正在使用Unity IoC容器解析我的对象。然而,我遇到了一个问题。当我有多个构造函数时,Unity如何知道使用哪一个?当我有一个带参数的和一个不带参数的时,它似乎使用了一个带参数的。我可以明确地告诉它使用哪个构造函数吗 具体来说,我有一个类似于下面的Person类的案例,有两个构造函数。在本例中,我希望IoC容器使用默认构造函数(不带参数),但它选择带参数的构造函数 public class SomeValueObject { public SomeValueObject(strin
public class SomeValueObject
{
public SomeValueObject(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class Person
{
private string _name;
public Person()
{
_name = string.Empty;
}
public Person(SomeValueObject obj)
{
_name = obj.Name;
}
}
这显然失败了,因为它无法创建SomeValueObject—不知道向其字符串参数注入什么。它给出的错误是:
依赖项解析失败,类型=“MyApp.Person”,名称=”。异常消息是:当前生成操作(生成密钥生成密钥[MyApp.Person,null])失败:尝试调用构造函数MyApp.Person(MyApp.SomeValueObject obj)时无法解析参数obj。(策略类型BuildPlanStrategy,索引3)
货柜登记:
Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
Container.RegisterType(新的Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
以及:
var person = Container.Resolve<Person>();
var person=Container.Resolve();
当目标类包含多个
一个具有相同编号的构造函数
对于参数,必须应用
注入构造函数属性
创建Unity容器的构造函数
将用于指示哪个构造函数
容器应使用。如同
自动构造函数注入,你
可以指定构造函数参数
作为具体类型,也可以指定
一种接口或基类,用于
Unity容器包含一个
注册映射
默认情况下,Unity选择具有最大参数数的构造函数。若要覆盖此项,请使用来装饰所需的构造函数。按如下方式注册它:
container.RegisterType<Person>(new InjectionConstructor());
container.RegisterType(新注入构造函数());
您还可以使用RegisterType方法的重载来添加LifetimeManager
这就是说,在为DI建模时,如果您有明确的构造函数(即没有重载构造函数),您的生活会轻松得多。我必须指出,您在这个实例中使用依赖项注入的方式是错误的。容器应该能够在构造上注入SomeValueObject
您最有可能要做的是注册SomeValueObject的默认对象,.Name属性返回
string.Empty
。不是IoC使用接口的目的???当然,我主要是这样做的。但是这并没有对这个问题产生影响。@Martin许多程序员使用类,避免了制造一个接口然后只有一个实现的假象。它还避免了你在大多数企业应用程序中看到的大量臭烘烘的IoC连线,但仍然允许你在需要时切换一些实现。也许我的简单示例有点不对劲,但在实际代码中需要两个不同的构造函数。。谢谢你的提醒。如果你还没写呢?你在引用哪个重载?@Casey…我相信是空构造函数。因为InjectionConstructor没有参数,所以它正在调用Person的空构造函数。如果代码是“new InjectionConstructor(new SomeValueObject(“John Smith”)”),则会调用(other)Person构造函数,其中“other”构造函数是使用SomeValueObject对象/参数的构造函数。您还可以执行new InjectionConstructor(typeof(IMyDependency)、typeof(imysecondependency))
如果您不想为类的依赖项传入手动对象,而是想让Unity注入您已经注册的TypesLook,那么就指定一个具有依赖项的构造函数。您只需将Unity.Attributes.InjectionConstructorAttribute
放在构造函数上即可谢谢你为我指明了正确的方向!:)我们应该提到的是,修饰构造函数将组件作为其IoC容器耦合到Unity。在注册期间处理规范可能更可取,这样组件就不需要引用Unity,如果需要的话,可以交换不同的IoC。