Внедрение того же экземпляра с помощью StructureMap - PullRequest
4 голосов
/ 23 июня 2011

У меня есть интерфейс 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 голосов
/ 23 июня 2011
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. Я также устал от нескольких названных связей. Фу и Бар все еще понимают, к чему они стремятся.

1 голос
/ 23 июня 2011

То, что я сделал в аналогичном случае (но на самом деле я просто новичок в 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(...);
}
...