2014-10-15 1 views
1

웹 API 컨트롤러가 있고 종속성을 해결하기 위해 Unity.WebAPI를 사용하고 있습니다. 내 Bootstrapper.cs 코드,Unity Container를 사용하여 웹 API의 종속성 종속성을 해결하려면 어떻게해야합니까?

public static class Bootstrapper 
{ 
    /// <summary> 
    /// Public method to initialise UnityContainer. 
    /// </summary> 
    public static void Initialise() 
    { 
     var container = BuildUnityContainer(); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
     // register dependency resolver for WebAPI RC 
     GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 
    } 

    /// <summary> 
    /// Register built in types. 
    /// </summary> 
    /// <returns></returns> 
    private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IUserService, UserService>().RegisterType<UnitOfWork>(new HierarchicalLifetimeManager()); 

     return container; 
    } 
} 

이 내 컨트롤러 코드는, 내 UsersController 내 UserService를 해결,

private readonly IUserService _userService; 




/// &lt;summary&gt; 
/// Public constructor to initialize user service instance 
/// &lt;/summary&gt; 
/// &lt;param name=&quot;userService&quot;&gt;&lt;/param&gt; 
/// &lt;param name=&quot;tokenService&quot;&gt; &lt;/param&gt; 
public UsersController(IUserService userService) 
{ 
    _userService = userService; 

} 
이제

내 UserService는 다른 클래스에 따라 가정은 직원과 요구 다음 말입니다 새로운 Employee() 인스턴스, 즉 UserService 인스턴스가 필요합니다. UserService에서이 새 Employee() 클래스의 종속성을 어떻게 해결할 수 있습니까? 또한 Employee 클래스는 인터페이스를 구현하지 않습니다.

더 이상의 설명이 필요하면 답장을 보내주십시오. 나는 그 질문에 분명히 희망한다.

답변

2

종속성 주사기는 동작 클래스 (서비스, 처리기, 관리자 등) 만 삽입 할 수 있고 (해야 함) 데이터 소유자 클래스 (엔터티, poco 등)를 삽입 할 수 없습니다. 따라서 약간의 디자인을 변경해야 에 Employee 인스턴스를 제공 할 수 있습니다.

예를 들어, IUserService은 삽입 할 수있는 IEmployeeProvider에 따라 달라질 수 있습니다. 또한 직원 제공 업체는 직원이 데이터를 저장 한 곳 (데이터베이스, 세션)에서 직원 투 입을로드/검색 할 수 있습니다. 애플리케이션이 어느 직원을 사용할 지 결정하는 것은 애플리케이션에 따라 다릅니다.

일반적으로 composition root는 시작시 만들어지며 나중에 변경해서는 안됩니다.

귀하의 UsersControllerDependencyResolver에 의해 직접 생성되며, 그 시점에서 귀하의 직원은 아직 알려지지 않았습니다.

+0

Employee 클래스의 이름으로 혼동하지 마십시오. 원하는 모든 클래스의 XYZ.All을 원할 수 있습니다. UserService가 인스턴스화 될 때 UserService가 종속 된 XYZ 클래스도 인스턴스화됩니다. 암호? –

+0

'IUserService'등록과 마찬가지로 컨테이너에 등록해야합니다. – Maarten

0

BuildUnityContainer 메서드에서 필요한 형식 매핑을 등록하기 만하면됩니다.

팩토리 메서드를 사용하거나 인스턴스를 등록하는 방법에 대한 단일 문서를 참조하십시오.

+0

정확하게 쓰여 져야하는 코드와 제안 된 위치를 알려주십시오. –

+0

형식 매핑을 등록하려면 [this] (http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.unitycontainerextensions.registertype (v = pandp.30) .aspx) 및 [여기] (http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.unitycontainerextensions.registerinstance(v=pandp.30).aspx) 인스턴스 등록 방법 –

관련 문제