我的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)
{
}
}
我该怎么做?
答案 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>();
}
}
希望这有帮助。