4

我有一个接口IConnection,由TcpConnection实现。另外,两个类接受IConnection作为参数,并且我想为此使用同一个TcpConnection实例。使用StructureMap输入相同的实例

问题是它似乎没有工作。对于我尝试的每种方法,TcpConnection都创建了多次。下面是我使用的注册子类:

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为辛格尔顿(“对于<>()辛格尔顿()。”),但没有帮助。我正在使用StructureMap 2.6.1。

任何想法?

回答

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仍然可以获得他们想要的连接。

+0

请参见结束我的帖子,我已经尝试过使用辛格尔顿。我不能在我的情况下使用“使用<>()”,因为其他对象需要其他连接。 – kshahar

+0

编辑我的帖子的例子我试过 – Bassetassen

+1

谢谢,我想发布适用于我的解决方案(基本上相同,只需用HybridHttpOrThreadLocalScoped替换Singleton),但您的解决方案也适用。 – 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(...); 
} 
+0

对不起,我意外发布了未完成帖子... –

+0

此方法被称为“使用外部构造的对象”(http://structuremap.net/structuremap/InstanceExpression.htm#section12)。但是这意味着如果TcpConnection具有依赖关系,我将不得不手动解决它们... – kshahar

+0

是的,我想是的,但是当您调用GetInstance <>手动解决时,您仍然有自动下拉链依赖关系 –

相关问题