2016-10-26 3 views
0

에 의해 인스턴스 그룹 만들기.내가이 클래스가 있다고 가정 이름 AutoFac

특정 이름의 프로세스 개체가 이미 생성 된 경우 해당 특정 인스턴스를 반환하고 싶습니다. 내 현재 코드에서

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterType<ProcessObject>(); 
builder.RegisterType<ProcessObject>().As<IProcessObject>().; 
Container = builder.Build(); 
var obj1 = Container.Resolve<IProcessObject>(new NamedParameter("Name", "UniqueObjectByName1"));//Does not exist, create new instance 
var obj2 = Container.Resolve<IProcessObject>(new NamedParameter("Name", "UniqueObjectByName1"));//An instance with this name exists, return that instance 
var obj3 = Container.Resolve<IProcessObject>(new NamedParameter("Name", "UniqueObjectByName2"));//Does not exist, create new instance 
Debug.WriteLine(obj1.Equals(obj2));//this is currently returning False, I would like it to be true 
Debug.WriteLine(obj1.Equals(obj3)); 

"사용의 샘플 코드는"나는 내 모든 ProcessObjects 추적하는 데 ProcessObject 클래스와 싱글 목록에서 정적 메서드를함으로써이 원칙을 유지한다.

public static GetInstance(string Name) 
{ 
    if (ProcessObjects.GetInstanceByName(Name) == null) 
    { 
     return new ProcessObject(Name); 
    } 
    else return ProcessObjects.GetInstanceByName(Name); 
} 

여전히 필요합니까, 아니면 AutoFac이 속성의 값으로 고유 한 인스턴스를 반환하는 솔루션을 제공합니까?

답변

1

Autofac에서는 개체의 이름을 지정하거나 메타 데이터를 즉시 추가 할 수 없으므로 인스턴스를 이름으로 캐시하는 팩토리 메서드가 필요합니다. 그것은 보인다 있도록 이름으로 캐시처럼

그러나 Autofac에 그 공장을 묶을 수 :

:

// Let's say your factory is like this, where the cache 
// is stored in the instance, like a hash table. Adjust 
// your code as necessary. 
builder.RegisterType<MyCachingFactory>() 
    .As<IFactory>() 
    .SingleInstance(); 

// Register a lambda that looks at the inbound set 
// of parameters and uses the registered factory 
// to resolve. 
builder.Register((c, p) => 
{ 
    var name = p.Named<string>("Name"); 
    var factory = c.Resolve<IFactory>(); 
    return factory.GetInstanceByName(name); 
}).As<IProcessObject>(); 

가 지내요, 당신은 당신이 원하는 것을 할 수 있어야

container.Resolve<IProcessObject>(new NamedParameter("Name", "a")); 
+0

굉장한 솔루션! 나는 한 가지 질문 만하고, 당신의 샘플에있는 메소드는 "factory.GetInstanceByName (name);" 내 이전 메서드 "GetInstance (string Name)"과 동일합니까? 아니면 그걸 바꾸시겠습니까? – Snovva1

+0

죄송합니다, 당시 공장 방식의 시체를보고 있었지만 다르게 이름이 붙은 것을 몰랐습니다. 당신이 부르는 것이 중요하지 않습니다. 의도는 같습니다. –