Использование синглтона StructureMap (класс, реализующий два интерфейса) - PullRequest
36 голосов
/ 02 марта 2010
public interface IInterface1
{
}

public interface IInterface2
{
}

public class MyClass : IInterface1, IInterface2
{
}

...

ObjectFactory.Initialize(x =>
{
    x.For<IInterface1>().Singleton().Use<MyClass>();
    x.For<IInterface2>().Singleton().Use<MyClass>();
});

var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();

Я получаю два разных экземпляра MyClass с приведенным выше кодом. Как я могу получить один?

Ответы [ 4 ]

52 голосов
/ 03 марта 2010

Вы можете использовать регистрацию Forward <,> (), чтобы сообщить StructureMap о разрешении типа, используя разрешение другого типа. Это должно сделать то, что вы ожидаете:

ObjectFactory.Initialize(x =>
{
    x.For<IInterface1>().Singleton().Use<MyClass>();
    x.Forward<IInterface1, IInterface2>();
});
13 голосов
/ 02 марта 2010

Я бы зарегистрировал сам MyClass, а затем извлек это из контекста для операторов Use отдельных интерфейсов.

ForSingletonOf<MyClass>().Use<MyClass>();

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());
1 голос
/ 02 марта 2010

Попробуйте посмотреть на различные перегрузки для использования, особенно на перегрузку Func. Оттуда вы можете сказать, как StructureMap должен создать ваш экземпляр с другим уже зарегистрированным объектом.

0 голосов
/ 02 марта 2010

ObjectFactory - это , предназначенное для создания нескольких экземпляров. Если вам нужен одноэлементный класс, напишите одноэлементный класс (возможно, с открытыми свойствами IInterface1 и IInterface2 в качестве методов доступа).

Кажется, что это схематично задокументировано, но, возможно, вместо этого вы можете использовать Контейнер .

...