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

36
задан Pontus Gagge 2 March 2010 в 13:44
поделиться

4 ответа

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

ObjectFactory.Initialize(x =>
{
    x.For<IInterface1>().Singleton().Use<MyClass>();
    x.Forward<IInterface1, IInterface2>();
});
53
ответ дан 27 November 2019 в 05:53
поделиться

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

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

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());
13
ответ дан 27 November 2019 в 05:53
поделиться

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

1
ответ дан 27 November 2019 в 05:53
поделиться

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

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

-4
ответ дан 27 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: