使用StructureMap注入相同的实例

时间:2011-06-23 08:02:57

标签: c# dependency-injection scope inversion-of-control structuremap

我有一个接口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。

有什么想法吗?

2 个答案:

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