3

以下を検討してください

class ServiceA : IServiceA
    {
        public void SayHelloFromA()
        {
            Console.WriteLine("Hello Service A");
            Console.ReadKey();
        }
    }    
    class ServiceB : IServiceB{ } 
    class ServiceC : IServiceC{ }
    interface IServiceA 
    { 
        void SayHelloFromA(); 
    }
    interface IServiceB{ }
    interface IServiceC{ }

Service Locator パターンを使用したい場合、ここで提供されている例は完全に機能します。

ここで、以下に示すように、別のクラスが IServiceA インターフェイスを実装するとします。

class ServiceA1 : IServiceA
{
    public void SayHelloFromA()
    {
        Console.WriteLine("Hello Service A1");
        Console.ReadKey();
    }
} 

それに応じて、次のようにサービスを辞書に追加する必要があります

internal ServiceLocator()    
        {        
            services = new Dictionary<object, object>();         

            this.services.Add(typeof(IServiceA), new ServiceA());
            this.services.Add(typeof(IServiceA), new ServiceA1());     
            this.services.Add(typeof(IServiceB), new ServiceB());        
            this.services.Add(typeof(IServiceC), new ServiceC());    
        } 

重複キーは辞書に存在できないため、これは間違っています。

では、どうすればこの問題を解決できますか? Service Locator が両方に対応できるようにするには、データ構造をどのように変更する必要がありますか。

注意: ファクトリ メソッドでサービス ロケータ パターンを実装しようとしています。

public class CustomerFactory : ICustomerBaseFactory

{

          public IBaseCustomer  GetCustomer(string  CustomerType)

          { 
                   switch(CustomerType)

                   { 
                             case "1": return  new Grade1Customer(); break;

                             case "2": return new Grade2Customer(); break;

                             default:return null; 
                   } 
          } 
}

Concrete Factory がIBaseCustomerから派生している場所

ありがとう

4

2 に答える 2

0

Java には、キーごとに複数の値をサポートするMultiMapクラスがあります。C# でも同様のデータ構造を見つけることができると確信しています。

于 2013-03-26T11:05:51.450 に答える
0

トップレベルのディクショナリ内にネストされた具象型によってキー付けされた抽象型ごとのディクショナリを検討しましたか?

Dictionary<T, Dictionary<T, U>>

このようにして、最上位のディクショナリを型別にクエリし、その型を実装するすべてのサービスのサブディクショナリをクエリできます。

例えば

var services = new Dictionary<Type, Dictionary<Type, Object>>();

これで、サービス ディクショナリにタイプを問い合わせることができます。

services.TryGetValue(typeof(IServiceA), componentDictionary);

これが true を返す場合、componentDictionary にはそのサービスを実装するコンポーネントが含まれていることがわかります。

foreach (c in componentDictionary.Values) {... }

抽象基本型とジェネリックを賢く使用すると、これよりも厳密に型指定されたソリューションを作成できます。ただし、これはキャストを使用しても、かなりうまく機能するはずです。

于 2013-03-25T09:23:21.340 に答える