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