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

时间:2014-12-22 06:09:00

标签: c# constructor structuremap structuremap3

我的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)
    {
    }
}

我该怎么做?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以配置StructureMap以了解如何使用构造函数参数:

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

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

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

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

答案 2 :(得分:0)

您应该能够解决此类型:

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

作为StructureMap自动连接具体类型(因此您不需要注册 MyUserControl MyClass )。此代码工作所需的只是让 IMyInterface 注册:

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

尝试解析 MyUserControl 时会出现什么错误?

旁注

你可以轻松地重构这个:

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>();
    }
}

希望这有帮助。