Class UnityContainer。如何使用参数注册类构造函数

Class UnityContainer。如何使用参数注册类构造函数,class,dependency-injection,constructor,dependencies,unity-container,Class,Dependency Injection,Constructor,Dependencies,Unity Container,我是Microsoft Unity容器的新手,所以我的问题可能很简单。 我必须注册并解析只有一个无参数构造函数的类的实例。现在我想学习如何用一个简单的构造函数注册和解析一个类。这是我的班级 public class MyClass { private string a1; public string A1 { get { return a1; } set { a1 = value; } } private

我是Microsoft Unity容器的新手,所以我的问题可能很简单。 我必须注册并解析只有一个无参数构造函数的类的实例。现在我想学习如何用一个简单的构造函数注册和解析一个类。这是我的班级

public class MyClass
{
    private string a1;

    public string A1
        {
        get { return a1; }
        set { a1 = value; }
        }
    private int a2;

    public int A2
        {
        get { return a2; }
        set { a2 = value; }
        }
    public MyClass()
    { this.a1 = "aaaaa";
    this.a2 = 1;
    }

    public MyClass(string a1,int a2)
        {
        this.a1 = a1;
        this.a2 = a2;
        }
    }
我需要注册并解析MyClass()构造函数;然后,我试着注册第二个

        //App.xaml.cs
        container = new UnityContainer();
        container.RegisterType<MainView>();
        ............
        container.RegisterType<string>("A1");
        container.RegisterType<int>("A2");
        container.RegisterType<MyClass>("MyClassConstructor",new InjectionConstructor(new ResolvedParameter<string>("A1"),new ResolvedParameter<int>("A2")));

        //NavigationService.cs, create an instance of MyClass("mystring",100) and bind it to a window
        public Window ShowMainView()
        {
        var window = Container.Resolve<MainView>();

        MyClass myClass = Container.Resolve<MyClass>("MyClassConstructor", new ParameterOverrides { { "A1", "mystring" }, { "A2", 100 } });
        window.DataContext = myClass ;
        window.Show();
        return window;
        }
//App.xaml.cs
容器=新的UnityContainer();
container.RegisterType();
............
容器。注册表类型(“A1”);
容器。注册表类型(“A2”);
RegisterType(“MyClassConstructor”、new InjectionConstructor(new ResolvedParameter(“A1”)、new ResolvedParameter(“A2”);
//NavigationService.cs,创建MyClass的实例(“mystring”,100)并将其绑定到窗口
公共窗口ShowMainView()
{
var window=Container.Resolve();
MyClass MyClass=Container.Resolve(“MyClassConstructor”,新参数重写{{“A1”,“mystring”},{“A2”,100});
window.DataContext=myClass;
window.Show();
返回窗口;
}
当容器尝试创建MyClass实例时,出现以下错误:

依赖项解析失败,type=“MySolution.MyProject.ViewModels.MyClass”,name=“MyClassConstructor”。 解析时发生异常

异常为:InvalidOperationException-无法构造类型字符串。必须配置容器以提供此值。 发生异常时,容器为:

解析MySolution.MyProject.ViewModels.MyClass、MyClassConstructor 解析构造函数MySolution.MyProject.ViewModels.MyClass(System.String a1,System.Int32 a2)的参数“a1” 解析系统.字符串,A1


请帮助我了解它是如何工作的。谢谢你在注册方面做得太多了。
但更重要的是,您需要指定构造函数参数名(小写),而不是属性名(大写)

下面是它的外观:

    [TestMethod]
    public void Should_Be_Able_To_Pass_Parameters_To_Ctor()
    {
        var container = new UnityContainer();

        container.RegisterType<MyClass>();

        var myClass = container.Resolve<MyClass>( 
            new ParameterOverrides { { "a1", "mystring" }, { "a2", 100 } });

        Assert.IsNotNull(myClass);
        Assert.AreEqual("mystring", myClass.A1);
        Assert.AreEqual(100, myClass.A2);
    }
[TestMethod]
public void应该能够将参数传递给
{
var container=new UnityContainer();
container.RegisterType();
var myClass=container.Resolve(
新参数覆盖{{“a1”,“mystring”},{“a2”,100});
Assert.IsNotNull(myClass);
AreEqual(“mystring”,myClass.A1);
AreEqual(100,myClass.A2);
}
试试这个

int start_at = 1;
container.Register(
    Component.For<IMyComponent>().DependsOn(dependency: Dependency.OnValue<int>(start_at))
);                         
int start_at=1;
集装箱。登记(
Component.For().DependsOn(依赖项:dependency.OnValue(start_at))
);                         

谢谢David,现在我可以使用参数化构造函数创建MyClass实例了。因此,I ParameterOverrides构造函数必须将值绑定到参数名称。此外,如果我有一个具有更多构造函数的类,我必须为每个构造函数创建一个类型映射。再次感谢您只要将其他参数重写传递给resolve方法,就不需要再次注册它。这是针对运行时值btw.Grtz的。尽管如此,不建议使用多个构造函数,这只会使容器更复杂。此外,如果您使用的是运行时值,只需通过属性而不是构造函数来设置它们。我建议阅读马克·西曼的《.NET中的依赖注入》一书。