2009-09-27 5 views
6

아무도 도와 줄 수 있습니까? ..Unity (dependency injection) : RegisterType의 생성자에 매개 변수를 전달하는 방법

은 내가 WPF 응용 프로그램이 (문제 안)과 ONSTART에 난 내 부트 스트랩 물건을 가지고 그 같은 ..

 // Create unity container my service and repository 
     container = new UnityContainer() 
      .RegisterType<ISecurityRepository, SecurityRepository>() 
      .RegisterType<ISecurityService, SecurityService>(); 

은 기본적으로 ISecurityService 날 따라서하는 ISecurityRepository에 통과 할 것으로 예상 위의 실패합니다.

하지만 조금 혼란 스럽습니다. 새 IsecurityRespository를 만든 다음 전달해야합니까, 그렇지 않으면 개체가 깨지지 않습니까?

어쨌든 "SecurityService에 ISecurityRepository를 컨테이너에서 전달"하지만 아직 구축되지 않았습니까?

아이디어가 있으십니까?

+0

서비스 클래스의 생성자 정의를 게시 할 수 있습니까? –

+0

안녕 Lasse, 내가 정보를 추가했습니다 –

답변

4

먼저 인스턴스를 만들 필요가 없습니다. 그것은 모두 작동합니다. 이것이 IoC 컨테이너의 마법입니다.

예 : (당신이 당신의 후속 게시물을 가리 켰을 때)

SecurityRepository created 
SecurityService created 
Repository is A SecurityRepository 
My class has security: A SecurityService

당신은 당신의 인스턴스를 미리 생성과 같은 옵션의 번호가 나 :

public interface ISecurityService { } 
public interface ISecurityRepository { } 

public class SecurityService : ISecurityService 
{ 
    public SecurityService(ISecurityRepository repository) 
    { 
     Console.WriteLine("SecurityService created"); 
     Console.WriteLine("Repository is " + repository); 
    } 

    public override string ToString() 
    { 
     return "A SecurityService"; 
    } 
} 

public class SecurityRepository : ISecurityRepository 
{ 
    public SecurityRepository() 
    { 
     Console.WriteLine("SecurityRepository created"); 
    } 

    public override string ToString() 
    { 
     return "A SecurityRepository"; 
    } 
} 

public class MyClassThatNeedsSecurity 
{ 
    public MyClassThatNeedsSecurity(ISecurityService security) 
    { 
     Console.WriteLine("My class has security: " + security); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     using (IUnityContainer container = new UnityContainer()) 
     { 
      container.RegisterType<ISecurityRepository, SecurityRepository>() 
        .RegisterType<ISecurityService, SecurityService>(); 

      MyClassThatNeedsSecurity myClass = 
       container.Resolve<MyClassThatNeedsSecurity>(); 
     } 
    } 
} 

이 인쇄됩니다 주입 된 종속성의 수명을 연장시켜 필요할 때마다 재생성하지 못하게합니다. 그러나 기본 경우에는 이것이 효과적입니다.

+1

TrueWill! 그건, 그래서 내가 올바르게 이해하면 참조 registerTypes 때마다 해결할 때마다 새 인스턴스를 만들 것입니다? 내 후속 조치에서 내 방식을 사용하면 해결할 때마다 동일한 인스턴스가 사용됩니까? 그래서 나는 registerType 대신 registerInstance를 사용하는 것이 객체를 계속 유지해야 할 필요가 있다고 가정합니다. –

+1

@mark : 예, 기본 RegisterType 호출을 사용하면 Resolve **를 호출 할 때마다 새 인스턴스가 만들어지고 ** 해결 된 유형에는 (직접 또는 간접적으로) 종속성이 필요합니다. RegisterInstance를 사용하면 매번 동일한 인스턴스가 제공됩니다. 또한 과부하를 사용하여 Unity가 컨테이너 당 한 번만 인스턴스를 생성하도록 할 수 있습니다 (예 : Singleton). Unity 도움말에서 "myContainer.RegisterType (새 ContainerControlledLifetimeManager());" – TrueWill

+0

고마워! .. 큰 도움 .. –

1

여기 좀 더 자세한 정보가 있습니다. 내 클래스의 생성자는 조금 주위에 재생 후

public SecurityService(ISecurityRepository repository) 
     : base(repository) 
    { 

    } 

, 나는 다음과 같은 작업을 수행 할 관리하지만 일을 .. 보인다 ... 내가 먼저 인스턴스를 생성됩니다, 그러나 그것의 대안.

 // Create unity container my service and repository 
     ISecurityRepository securityRepository = new SecurityRepository(); 
     ISecurityService securityService = new SecurityService(securityRepository); 

     container = new UnityContainer(); 
     container.RegisterInstance<ISecurityRepository>(securityRepository); 
     container.RegisterInstance<ISecurityService>(securityService); 
+0

, 우리는 서비스 클래스의 여러 생성자가 있다면 어떻게해야합니까? 아래 문제를 참조하십시오. - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

관련 문제