Как использовать Container вместо ObjectFactory в StructureMap ServiceActivator?
При внедрении DI в WebAPI с StructureMap мы использовали ServiceActivator, найденный в
public class ServiceActivator : IHttpControllerActivator
{
public ServiceActivator(HttpConfiguration configuration) {}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
return controller;
}
}
Но теперь с новой StructureMap мой ReSharper предложил:
Класс 'StructureMap.ObjectFactory' устарел: ObjectFactory будет удален в будущей версии StructureMap 4.0. Способствуйте использованию класса Container для дальнейшей работы.
На intellisense на Container
была представлена только очень ограниченная информация.
Как мы должны переписать наш ServiceActivator с помощью класса Контейнер?
Ответы
Ответ 1
Статический материал уходит. Если вы не используете локатор сервисов какого-либо типа, вы собираетесь реализовать свой собственный "ObjectFactory
" как указанный здесь:
public static class ObjectFactory
{
private static readonly Lazy<Container> _containerBuilder =
new Lazy<Container>(defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication);
public static IContainer Container
{
get { return _containerBuilder.Value; }
}
private static Container defaultContainer()
{
return new Container(x =>
{
// default config
});
}
}
Обновление: Мой предыдущий ответ был неправильным. Спасибо @JoeMighty за головы.