2016-10-26 5 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(名前)のメソッドは、1つの質問を持って、"私の古いメソッド "GetInstance(string Name)"と同じですか?それともあなたもそれを変えるでしょうか? – Snovva1

+0

申し訳ありませんが、私はその時点であなたの工場の方法の本体を見ていましたが、別の名前を付けられたことを認識していませんでした。それはあなたが何を呼んでも問題ではなく、意図は同じです。 –

関連する問題