以下を検討してください
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から派生している場所
ありがとう