Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指定要使用的Unity IoC容器的构造函数_C#_.net_Unity Container_Ioc Container - Fatal编程技术网

C# 指定要使用的Unity 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

我正在使用Unity IoC容器解析我的对象。然而,我遇到了一个问题。当我有多个构造函数时,Unity如何知道使用哪一个?当我有一个带参数的和一个不带参数的时,它似乎使用了一个带参数的。我可以明确地告诉它使用哪个构造函数吗

具体来说,我有一个类似于下面的Person类的案例,有两个构造函数。在本例中,我希望IoC容器使用默认构造函数(不带参数),但它选择带参数的构造函数

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。