2016-10-20 1 views
1

완전히 싱글 톤 응용 프로그램 (웹 및 콘솔)을 만들려고합니다. 하지만 Entity DbContext는 웹에서 PerWebRequest를 사용해야합니다.모든 클래스가있는 DryIoc WebRequest로 Singleton 및 DbContext

이것을 지원하려면 컨테이너에 어떻게 등록해야합니까? 일단 클래스가 싱글 톤으로 초기화되면, 나는 싱글 톤으로 모든 주입 된 클래스를 가진 메모리상의 단일 인스턴스에서 실행될 것임을 이해합니다.

다음 코드는 모든 웹 응용 프로그램 및 콘솔 응용 프로그램에 대한 컨테이너 초기화입니다. - 콘솔에서 실행할 때 어떻게 등록해야합니까? - Web에서 실행 중일 때 Owin이 시작 작업을 호출 할 때가끔 인증에서 사용할 객체를 확인해야하지만 Owin은 "컨텍스트 없음"환경에서 실행됩니다. 어떻게 탐지하고 사용합니까? 당신이 주변 범위 컨텍스트를 사용하는 것처럼

private static IContainer Initialize(IContainer container) 
    { 
     if (container == null) 
      container = new Container(
       rules => rules 
        .WithDefaultReuseInsteadOfTransient(Reuse.InWebRequest) 
        .WithFactorySelector(Rules.SelectLastRegisteredFactory()) 
        .With(FactoryMethod.ConstructorWithResolvableArguments) 
        .WithoutThrowOnRegisteringDisposableTransient(), 
       scopeContext: new AsyncExecutionFlowScopeContext() 
      ); 

     string prefix = GetPrefix(); 

     var implementingClasses = 
      AppDomain.CurrentDomain.GetAssemblies().ToList() 
       .Where(x => x.FullName.StartsWith(prefix)) 
       .SelectMany(x => x.GetTypes()) 
       .Where(type => 
        (type.Namespace != null && type.Namespace.StartsWith(prefix)) && 
        type.IsPublic &&     // get public types 
        !type.IsAbstract &&     // which are not interfaces nor abstract 
        type.GetInterfaces().Length != 0); // which implementing some interface(s) 

     Parallel.ForEach(implementingClasses, implementingClass => 
     { 
      container.RegisterMany(new[] { implementingClass }, Reuse.Singleton, serviceTypeCondition: type => type.IsInterface); 
     }); 

     return container; 
    } 

답변

0

당신은 당신의 싱글에 Func<DbContext>로 DbContext를 주입/소비 할 수 있습니다. 그런 다음 Func이 호출 될 때마다 현재 앰비언트 범위/요청에 바인딩 된 값을 반환합니다.

+0

이 샘플과 같은 일반 등록 방법을 만드는 방법에 대한 예가 있습니까? ' 공용 static IContainer를 RegisterWebRequest (이 IContainer를 용기) { container.Register , Func을 > (재사용 : Reuse.InWebRequest 만들었다 : Made.Of (() => 새로운 T()) ifAlreadyRegistered : IfAlreadyRegistered.Replace); 반품 용기; ' – lcmassena

+0

제 마지막 코멘트를 무시하십시오. 귀하의 bitbucket에서 문제를 만들었습니다 : https://bitbucket.org/dadhi/dryioc/issues/378/resolve-a-single-instance-inwebrequest – lcmassena