0

나는 IoC 컨테이너로 Microsoft Unity을 사용하고이 같은 일부 코드 작성 :SimpleInjector에서 생성자로 제네릭 형식을 등록하는 방법?

public static void RegisterTypes(IUnityContainer container) 
{ 
    MyContext ctx = new MyContext(); // is EntityFramework DbContext 
    container.RegisterType(typeof(IEntityRepository<>), 
          typeof(EntityRepository<>), 
          new InjectionConstructor(ctx)); 
    container.RegisterType(typeof(IEntityService<>), 
          typeof(EntityService<>)); 
} 

그것은 문제없이 나를 위해 작동을하지만, 나는 에서 동등한 SimpleInjector을 작성하는 방법을 알고 싶어요.

+2

[docs] (https://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Registration-Of-Open-Generic-Types)를 원할 수도 있습니다. MyContext가 컨테이너에 등록되어있는 한, 파라미터로서 해결됩니다. –

+1

또는 [Read The Docs] (https://simpleinjector.readthedocs.org/en/latest/)에서 문서를 읽을 수 있습니다. – Steven

답변

3

구성에 특별한 것은 없으며 @Patryk이 올바른 설명서 here을 지적했습니다. Simple Injector는 자동 배선을 수행하므로 생성자 인수를 명시 적으로 지정할 필요가 없습니다.

하지만 현재 설정에 대해 악취가납니다. DbContext은 (는) 싱글 톤입니다. 전체 애플리케이션 기간 동안 하나의 인스턴스 만 가질 수 있습니다. 거의 모든 경우에 very bad idea입니다. 응용 프로그램이 오래 동안 (예 : Windows 서비스) 또는 많은 스레드를 동시에 처리합니다 (예 : ASP.NET 및 WCF). 콘솔 응용 프로그램과 같이 매우 짧은 시간 동안 살아있는 단일 스레드 응용 프로그램이있는 경우에만 하나의 DbContext 만있을 수 있습니다. DbContext를 싱글 톤으로 등록하고 싶지는 않습니다.

아마도 싱글 톤이 아니며 실제로 요청 당 1 회이 전화는 RegisterTypes입니다. 이 경우 하나의 요청마다 하나의 DbContext를 갖게됩니다. 그러나 이는 요청마다 새 컨테이너 인스턴스를 만드는 것이 좋지 않을 수도 있음을 의미합니다. Unity와 Simple Injector 모두 성능면에서 매우 좋지 않습니다. DI 라이브러리는 특히 응용 프로그램의 지속 기간 동안 하나의 단일 컨테이너 인스턴스를 가지도록 최적화되어 있습니다.

오히려 애플리케이션 기간 동안 단일 컨테이너 인스턴스를 보유하고 DbContext를 보통 Scoped 라이프 스타일에 등록하려고합니다.

단순 주입기에는 many scoped lifestyles이 있으며 각각은 선택한 기술에 따라 다릅니다. 당신이 MVC를 사용하는 가정, 등록은 다음과 같습니다

public static void RegisterTypes(Container container) 
{ 
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

    container.Register<MyContex>(Lifestyle.Scoped); 

    container.Register(typeof(IEntityRepository<>), typeof(EntityRepository<>)); 

    container.Register(typeof(IEntityService<>), typeof(EntityService<>)); 
} 

EntityRepository<T>의 등록을 유의 마십시오. EntityRepository<T>에 생성자 인수가 MyContext이고 MyContext이 컨테이너에 등록되어 있으면 Simple Injector가 생성자에서이 종속성을 주입 할 수 있습니다. 이 과정을 자동 배선이라고하며 일반적으로 컨테이너가이 작업을 수행하도록해야합니다. DI 구성이 훨씬 유지 보수 가능하기 때문입니다.

+0

이 작동하지 않습니다. 형식 EntityRepository 의 생성자에 DbContext 유형의 매개 변수가 포함되어 있습니다. 'dbContext'라는 이름이 등록되지 않았습니다. DbContext가 컨테이너에 등록되어 있는지 확인하거나 EntityRepository 의 생성자를 변경하십시오. 왜 ?? –

+0

@HamedF : 당신의 질문에 당신의'EntityRepository '이'MyContext' 대신에'DbContext'에 의존했다는 것을 당신에게 말하지 않았기 때문에 :-). Simple Injector에서는 유형을 사전에 키로 등록하고 Simple Injector는 키로 유형을 찾습니다. 그것은 당신을위한 상속 계층을 걷지 않습니다; 단지 정확한 유형을 찾습니다. 그래서 당신은'DbContext'를 등록해야합니다. 예를 들어 :'container.RegisterPerWebRequest ();' – Steven

+0

감사합니다 @Steven now works :) –

관련 문제