使用 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)
{
}
}
我该怎么做?
您可以尝试将参数传递给构造函数,如下所示:
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 会自动连接具体类型(因此您无需注册 MyUserControl 和 MyClass(。要使此代码正常工作,您只需要注册 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>();
}
}
希望这有帮助。