0

나는 생성자 종속성 주입을 사용하는 서비스를 시작하는 API 컨트롤러가 있습니다. Windsor 컨테이너를 사용하여 종속성을 주입하고 싶습니다. 그러나 모범 사례는 확실하지 않습니다.API 컨트롤러의 Castle Windsor 컨테이너에서 해결

private readonly IWindsorContainer _container; 
... 
public IService Create(Type serviceType, ApiRequestModel apiRequest) 
{ 
    Arguments args = new Arguments(new { request = apiRequest }); 
    return (IService)_container.Resolve(serviceType, args); 
} 
... 

여기 API 컨트롤러의 일부 :

private readonly IWindsorContainer _container; 
private readonly ServiceFactory _serviceFactory; 
... 
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
{ 
    Arguments args = new Arguments(new { serviceFactory = _serviceFactory }); 
    IHttpController controller = (IHttpController)_container.Resolve(controllerType, args); 
    request.RegisterForDispose(new Release(() => _container.Release(controller))); 
    return controller; 
} 
... 

여기에 서비스 공장의 일부 :

다음은 API 컨트롤러 공장의 일부

private ServiceFactory _serviceFactory { get; set; } 
... 
public object Post([FromBody]ApiRequestModel request) 
{ 
    ... 
    Type serviceType = Assembly.Load("TestProject").GetType("TestClass"); 
    IService instance = _serviceFactory.Create(serviceType, request); 
    ... 
    _serviceFactory.Release(instance); 
} 
... 

본 서비스 공장 Windsor 컨테이너의 인스턴스를 포함하므로 API 컨텍스트에 노출시키는 것은 좋지 않습니다. 올러? 그렇다면 가장 좋은 대안은 무엇입니까? 감사.

답변

0

내 솔루션은 일반적인 입력 된 공장 시설 (예 : http://thesenilecoder.blogspot.com/2012/04/ioc-windsor-typedfactoryfacility-and.html)

를 사용하는 것이었다 공장은 다음과 같은 인터페이스로 구성

:

public interface IServiceFactory 
{ 
    T Create<T>(ApiRequestModel request) where T : IService; 

    void Release(IService service); 
} 

를 그리고 여기가 컨테이너에 설치되는 방법은 다음과 같습니다

container.AddFacility<TypedFactoryFacility>(); 
container.Register(
    Component.For<IServiceFactory>().AsFactory(), 
    Classes.FromThisAssembly().BasedOn<IService>().LifestylePerWebRequest()); 

API 컨트롤러에 삽입되어 제네릭 형식을 만들 수 있습니다. 공장에 가기 전에 리플렉션을 사용하여 제네릭 유형을 해결했습니다.

Type serviceType = Assembly.Load("TestProject").GetType("TestClass"); 
MethodInfo factoryMethod = _serviceFactory.GetType().GetMethod("Create").MakeGenericMethod(serviceType); 
IService instance = (IService)factoryMethod.Invoke(_serviceFactory, new object[] { request }); 
0

죄송 합니다만 서비스 탐지기로 사용하지 않는 IoC 컨테이너를 올바르게 사용하지 못하는 것 같습니다.

Mark Seemann 게시물에 대한 내용은 how to integrate windsor in web api입니다.

하지만 먼저 Composition Root의 개념을 이해해야합니다.

윈저 위키는 mvc tutorial으로 시작하는 IoC/윈저 모범 사례의 훌륭한 소스입니다.

기타 누락 사항은 Krysztof guidelines/best practises입니다.