2つの引数(IClient
とICounter
)を受け取るクラス(Service
)があります。ユニティを2つの登録済みインターフェイスの同じインスタンスに挿入する方法
Iはユニティの両方(両方のインタフェースを実装Decorator
)用同じインスタンスを注入します。
どのようにですか?
そしてもう一つ:私はUnityが、スレッドごとを使用してService
に同じインスタンスを注入します。これは、スレッドごとに、container.Resolve<Service>()
が呼び出されるたびに、同じインスタンスが入力されます。
これはこれまでのコードです。私はタイプだけを登録して実行しますが、Decoratorクラスの3つのインスタンスが作成されます。この場合、1つのスレッドのみで、デコレータのインスタンスを1つだけ作成する必要があります。
あなたはDotNetFiddleでそれを実行することもできます。https://dotnetfiddle.net/Widget/m3PRQz
using System;
using Microsoft.Practices.Unity;
namespace ConsoleApplication1
{
public class Program
{
public static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<IClient>(new InjectionFactory(c => new Decorator(c.Resolve<Client>())));
container.RegisterType<ICounter, Decorator>();
container.Resolve<Service>();
Console.WriteLine(Decorator.NumberOfInstances + " instances of Decorator have been created");
}
}
public class Client : IClient
{
}
public class Decorator : IClient, ICounter
{
public static int NumberOfInstances { get; private set; }
public Decorator(IClient client)
{
NumberOfInstances++;
}
}
public interface ICounter
{
}
public interface IClient
{
}
public class Service
{
public Service(IClient client, ICounter counter)
{
}
}
}
EDIT:私はDIを使用していなかった場合、私はこのコードを記述します。簡単にするために、私はどのメソッドも呼び出さないことを覚えておいてください。
public class Program
{
public static void Main(string[] args)
{
var t1 = Task.Run(() => CreateService());
var t2 = Task.Run(() => CreateService());
}
private static Service CreateService()
{
var decorator = new Decorator(new Client());
return new Service(decorator, decorator);
}
}
:スレッドごと
レジスタデコレータ:デコレータに
マップ・インターフェースをDIコンテナを使用していない場合は、このオブジェクトグラフを作成します。 – Steven
@スティーブン編集した質問を見てください。各スレッドについて、IClientとICounterの両方のサービスとデコレータを用意します。 – SuperJMN
あなたのデコレータは 'ICounter'を実装するかもしれませんが、' IClient'だけをラップするので、 'ICounter'のデコレータではありません。この「Decorator」は、ICounterメソッドが使用された場合に、実際のICounterにどのようにコールを転送しますか? – Steven