使用StructureMap注入相同实例

4
我有一个接口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<>().Singleton()”),但这也没有帮助。我正在使用StructureMap 2.6.1。
有什么想法吗?
2个回答

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仍然获得了它们应该获得的连接。

请看我帖子的结尾,我已经尝试使用了Singleton。在我的情况下,我不能使用“Use<>()”,因为其他对象需要其他连接。 - kshahar
1
谢谢,我想分享一下对我有效的解决方案(基本上是一样的,只是将Singleton替换为HybridHttpOrThreadLocalScoped),但你的解决方案也可以。 - kshahar

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

这种方法被称为“使用外部构建的对象”(http://structuremap.net/structuremap/InstanceExpression.htm#section12)。但这意味着如果TcpConnection有依赖关系,我就必须手动解决它们... - kshahar
是的,我猜是这样,但是当您调用 GetInstance<> 进行手动解析时,仍然需要沿着链自动装配那些依赖项。 - Denis Biondic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接