Подтвердить что ты не робот

Использование SingleMonline StructureMap (класс, реализующий два интерфейса)

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 с указанным выше кодом. Как я могу получить его?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());

Ответ 3

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

Ответ 4

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

По-видимому, он задокументирован, но, возможно, вы можете использовать Container.