0

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

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

这是UserControlFactory代码:

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

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

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

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

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

我怎样才能做到这一点?

4

3 回答 3

0

You could try to pass parameter to the constructor as follows:

public class UserControlFactory:IUserControlFactory
{
    public T Create<T>(MyClass object1) where T : UserControl
    {
        return (T) ObjectFactory.With("object1").EqualTo(object1).GetInstance(typeof(T));
    }
}
于 2014-12-22T07:28:59.083 回答
0

您应该能够解决这种类型:

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

作为 StructureMap 自动连接具体类型(因此您不需要注册MyUserControlMyClass)。要使此代码正常工作,您只需注册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>();
    }
}

希望这可以帮助。

于 2014-12-22T21:33:48.090 回答
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 的答案。

于 2014-12-22T13:20:29.297 回答