使用 StructureMap 3 时将对象传递给构造函数

本文关键字:构造函数 对象 StructureMap 使用 | 更新日期: 2023-09-27 18:34:50

我的 c# 项目中有一些 UserControl 并使用 Structuremap 3 作为我的 IoC 容器,当我想访问 UserControl 时,我使用以下代码:

var uc = new UserControlFactory().Create<MyUserControl>();
....

这是UserControlFactory代码:

public class UserControlFactory:IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return (T) ObjectFactory.GetInstance(typeof(T));
    }
}

当我有一些interface作为我的UserControl构造函数参数时,它可以正常工作:

public class MyUserControl:UserControl
{
    public MyUserControl(IMyInterface myInterface)
    {
    }
}

但是现在我想通过 UserControl 构造函数传递一个对象:

public class MyUserControl:UserControl
{
    public MyUserControl(IMyInterface myInterface,MyClass object1)
    {
    }
}

我该怎么做?

使用 StructureMap 3 时将对象传递给构造函数

您可以尝试将参数传递给构造函数,如下所示:

public class UserControlFactory:IUserControlFactory
{
    public T Create<T>(MyClass object1) where T : UserControl
    {
        return (T) ObjectFactory.With("object1").EqualTo(object1).GetInstance(typeof(T));
    }
}

您可以配置 StructureMap 以了解用于构造函数参数的内容,如下所示:

            c.For<IFoo>().Use<Foo>().Ctor<Bar>(bar);

在您的情况下,它可能看起来更像这样:

            var myClass = new MyClass();
            c.For<MyUserControl>().Use<MyUserControl>().Ctor<MyClass>(myClass);

不过,这将对每个MyUserControl使用相同的MyClass实例。如果你想更好地控制每次使用什么对象,那么我会选择ialekseev的答案。

您应该能够解析此类类型:

public class MyUserControl : UserControl
{
    public MyUserControl(IMyInterface myInterface, MyClass object1)
    {
    }
}

因为 StructureMap 会自动连接具体类型(因此您无需注册 MyUserControlMyClass(。要使此代码正常工作,您只需要注册 IMyInterface

c.For<IMyInterface>().Use<MyInterface>();

当您尝试解析我的用户控件时,您会收到什么错误?

旁注

您可以轻松地重构它:

public class UserControlFactory : IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return (T) ObjectFactory.GetInstance(typeof(T));
    }
}

要使用提供的通用 API,请执行以下操作:

public class UserControlFactory : IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return ObjectFactory.GetInstance<T>();
    }
}

希望这有帮助。