C# 多内存构造函数的Unity InjectionConstructor仅重写单个构造函数

C# 多内存构造函数的Unity InjectionConstructor仅重写单个构造函数,c#,unity-container,C#,Unity Container,我有一个具有如下构造函数的类: public class Bar { public Bar(IFoo foo, IFoo2 foo2, IFoo3 foo3, IFooN fooN, String text) { } } 我想在Unity中注册Bar并为文本提供一个值: unity.RegisterType<Bar, Bar>(new InjectionConstructor("123")); unity.RegisterType(新注入构造函数(“12

我有一个具有如下构造函数的类:

public class Bar
{
    public Bar(IFoo foo, IFoo2 foo2, IFoo3 foo3, IFooN fooN, String text)
    {

    }
}
我想在Unity中注册Bar并为文本提供一个值:

unity.RegisterType<Bar, Bar>(new InjectionConstructor("123"));
unity.RegisterType(新注入构造函数(“123”);
但是我不能这样做,因为Bar没有单参数构造函数


是否有一种方法可以为文本提供一个值,而无需将所有其他参数指定为
ResolvedParameter
等。。我真的不喜欢它,有很多代码,每次我更改Bar的构造函数时,我都需要添加另一个ResolvedParameter,Unity无法立即执行此操作。您所能做的就是:

container.RegisterType(
新注入构造函数(
typeof(IFoo)、typeof(IFoo2)、typeof(IFoo3)、typeof(IFooN),“123”);
或者,您也可以使用项目提供的
SmartConstructor
。介绍了一些背景知识

注册情况如下所示:

public class Bar
{
    public Bar(IFoo foo, IFoo2 foo2, IFoo3 foo3, IFooN fooN, String text)
    {

    }
}
container.RegisterType(新的SmartConstructor(“text”、“123”);
公共无效寄存器(参数对象[]构造函数参数),其中TFrom:class
{
_RegisterType(新的InjectionConstructor(constructorParams));
}

我过去经常这样做,如上面的回答所述(使用的是
InjectionConstructor
)。问题是,如果构造函数的签名被更改,但是
InjectionConstructor
没有更新,那么我们只会在运行时知道这一点。我认为有一种更干净的方法可以做到这一点,而不必深入了解构造函数签名的细节。以下是如何:

public interface IBar
{
    void DoSomethingWithBar();
}

public interface IMyStringPrameterForBar
{
    string Value { get; }
}

public class MyStringPrameterForBar : IMyStringPrameterForBar
{
    public string Value { get; }
    public MyStringPrameterForBar(string value) => Value = value; 
}

public class Bar : IBar
{
    public Bar(IFoo foo, IFoo2 foo2, IFoo3 foo3, IFooN fooN, IMyStringPrameterForBar text)
    {
    }

    public void DoSomethingWithBar() {}
}
然后在注册接口时,只需添加:

unity.RegisterType<IFoo, Foo>();
unity.RegisterType<IFoo2, Foo2>();
unity.RegisterType<IFooN, FooN>();
unity.RegisterInstance(new MyStrignPrameterForBar("123"));
unity.RegisterType<IBar, Bar>();
unity.RegisterType();
unity.RegisterType();
unity.RegisterType();
unity.RegisterInstance(新MyStrignParameterForbar(“123”);
unity.RegisterType();
就这些。如果明天
Bar
需要使用更多或更少的参数,那么在添加或删除额外的
Foo
之后,Unity仍将自动构造
Bar


PS我认为实际上并不需要接口
IMyStringPrameterForBar
。但是,我更喜欢在Unity注册中只看到接口,因为在测试期间和/或出于任何其他目的更容易扭曲它们。

如果需要传递null而不是“123”,则需要使用typeof(IFoo)保存的新InjectionParameter(null),我不知道传递给InjectionConstructor.FWIW的是什么,这在AutoFac开箱即用中非常简单:
builder.RegisterType().WithParameter(“文本”、“文本值”)