我有一个接口IConnection,由TcpConnection实现。另外,两个类接受IConnection作为参数,我想为此使用相同的TcpConnection实例。
问题是它似乎不起作用。我尝试过的每一种方法都不止一次创建了TcpConnection。这是我正在使用的 Registry 子类:
public class InstanceRegistry : Registry
{
public InstanceRegistry()
{
var connection =
For<IConnection>.Add<TcpConnection>.
Named("Connection"); // ...and additional configuration
For<IFoo>.Add<Foo>.
// Ctor<IConnection>.Is(connection); // Did not work
Ctor<IConnection>.Is( i => i.GetInstance<IConnection>("Connection") );
For<IBar>.Add<Bar>.
// Ctor<IConnection>.Is(connection); // Did not work
Ctor<IConnection>.Is( i => i.GetInstance<IConnection>("Connection") );
}
}
我甚至尝试将IConnection声明为Singleton(“For&lt;&gt;()。Singleton()”),但这也无济于事。我正在使用StructureMap 2.6.1。
有什么想法吗?
答案 0 :(得分:3)
For<IConnection>().Singleton().Add<TcpConnection>().Named("Connection");
For<IFoo>().Add<Foo>().Ctor<IConnection>().Is(i=>i.GetInstance<IConnection>("Connection"));
For<IBar>().Add<Bar>().Ctor<IConnection>().Is(i=>i.GetInstance<IConnection>("Connection"));
当我使用上面的代码时,我在Foo和Bar中有相同的连接实例。我也厌倦了几个命名连接。 Foo和Bar仍然可以得到他们想要的连接。
答案 1 :(得分:1)
我在类似的案例中做了什么(但我真的只是一个StructureMap初学者,所以我期待任何建议)用于
For<>().Use(x => SomeFactoryMethod())
For<IInterface>().Use(x => CreateInstance());
private IInterface CreateInstance()
{
// get some dependancy
// inject it to both arguments down here
return new ConcreteInstance(...);
}