0

2つの引数(IClientICounter)を受け取るクラス(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); 
    } 
} 
+0

:スレッドごと

レジスタデコレータ:デコレータに

container.RegisterType<Decorator>( new PerThreadLifetimeManager(), new InjectionFactory(c => new Decorator(c.Resolve<Client>()))); 

マップ・インターフェースをDIコンテナを使用していない場合は、このオブジェクトグラフを作成します。 – Steven

+0

@スティーブン編集した質問を見てください。各スレッドについて、IClientとICounterの両方のサービスとデコレータを用意します。 – SuperJMN

+0

あなたのデコレータは 'ICounter'を実装するかもしれませんが、' IClient'だけをラップするので、 'ICounter'のデコレータではありません。この「Decorator」は、ICounterメソッドが使用された場合に、実際のICounterにどのようにコールを転送しますか? – Steven

答えて

1

あなたはこのような何か試すことができます。私たちはあなたが使用するコードを表示してください

container.RegisterType<ICounter, Decorator>(); 
container.RegisterType<IClient, Decorator>(); 
関連する問題