2010-07-27 5 views
1

에서 해결 인수에 동일한 인스턴스를 통과하지 I가 나는 그것이 ICommon 때의 새로운 인스턴스를 생성하는 동일한 인스턴스 수 있지만 각 생성자에서 공통 인수를 원하는Autofac는 생성자

public class CommonClass : ICommonClass 
{ 
} 

public class SomeClass : ISomeClass 
{ 
    public SomeClass(ICommonClass common, IOtherClass otherClass) {} 
} 

public class OtherClass : IOtherClass 
{ 
    public OtherClass(ICommonClass common) {} 
} 

//Registration 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 
builder.RegisterType<SomeClass>().As<ISomeClass>().InstancePerDependency(); 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 

다음 설치 SomeClass가 해결되었습니다. 어떻게하면이 시간을 가질 수 있을까요? InstancePerLifetimeScope로 등록하려고 시도했지만 SingleInstance와 동일하게 작동했습니다.

+0

이 몇 가지 추가 가능 solutio을 가지고 여기에 비슷한 질문이 있습니다 ns : http://stackoverflow.com/questions/5421803/how-to-inject-two-instances-of-same-object-using-autofac –

답변

0

InstancePerDependency은 모든 종속성에 대해 새 인스턴스가 필요할 때 사용할 수있는 방법입니다. 이제는 다양한 종속 클래스에 대해 다양한 수명을 가지기가 까다 롭고 올바르게 느끼지 않습니다. 왜이 행동이 필요한지 더 자세히 설명 할 수 있다면 더 좋은 방법이있을 수 있습니다.

당신이 묻는 것을 성취하기 위해 (나는 그것을 좋아하지 않지만) "인스턴스 홀더"를 사용할 수 있습니다. 내 생각에 정규 종속성의 경우 새로운 공통 인스턴스가 평소대로 제공됩니다.

public class CommonHolder 
{ 
    public ICommonClass Instance {get;private set;} 
    public CommonHolder(ICommonClass commonInstance) 
    { 
     Instance = commonInstance; 
    } 
} 

후 등록 설정 :

builder.RegisterType<CommonHolder>().SingleInstance(); 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 

builder.RegisterType<SomeClass>().InstancePerDependency(); 
builder.Register(c => 
    c.Resolve<SomeClass>(TypedParameter.From(c.Resolve<CommonHolder>().Instance))) 
    .As<ISomeClass>().InstancePerDependency(); 
+0

우리는 Common이 HttpRequestScoped 인 웹 응용 프로그램을 가지고 있습니다. 기존 서비스를 사용하는 Windows 서비스/콘솔 관리 앱에서 작업 중이므로 특정 작업을 실행 한 후 일반 설정이 필요합니다. – Thad

+0

그렇다면 아마도 두 응용 프로그램에 공통된 등록을 처리하는 세 가지 등록 모듈과 다른 등록을 처리하는 응용 프로그램마다 하나의 모듈로 작동 할 것입니다. –

+0

SomeClass (InstancePerDependency) 및 OtherClass (InstancePerDependency)가 주 어셈블리에 등록됩니다. Common은 각 응용 프로그램에 등록됩니다. 그것의 InstancePerDependency 내가 매번 새로운 하나를 얻을 때, 언제나 항상 InstancePerLifetime을 얻습니다. 그래서 나는 평생과 관련된 것을 놓치고 있어야합니다. – Thad

0

당신은 별도의 이름 등록을 만들 수 그러나 특별한 경우 SomeClass를 들어, 일반적인 인스턴스는 항상 같은 인스턴스를 제공이 홀더 클래스 페치 ICommonClass 및 사용의 SomeClass를 해결하는 경우에만 해당 :

// Existing registration 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 

// One-off registration 
builder 
    .RegisterType<CommonClass>() 
    .As<ICommonClass>() 
    .InstancePerLifetimeScope() 
    .Named<ICommonClass>("OneOffCommonClass"); 

// New registrations of dependents 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 

builder 
    .Register(c => new SomeClass(
     c.Resolve<ICommonClass>("OneOffCommonClass"), 
     c.Resolve<IOtherClass>())) 
    .As<ISomeClass>() 
    .InstancePerDependency();