如何编写具体类实现相同接口/服务的服务定位器模式?

时间:2013-03-25 04:53:19

标签: c# design-patterns service-locator

考虑以下

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{ }

如果我想使用服务定位器模式,提供的示例here可以很好地工作。

现在说另一个类实现了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());    
        } 

这是错误的,因为字典中不能出现重复的密钥。

那我怎么解决这个问题呢?应该如何更改数据结构,以便服务定位器可以容纳这两者。

N.B.~我正在尝试在我的工厂方法

中实现Srvice Locator Pattern
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; 
                   } 
          } 
}

混凝土工厂来自 IBaseCustomer

由于

2 个答案:

答案 0 :(得分:0)

您是否考虑过嵌套在顶级词典中的具体类型键入的每个抽象类型的词典?

Dictionary<T, Dictionary<T, U>>

这样,您可以按类型查询顶级字典,然后查询子字典以查找实现该类型的所有服务。

e.g。

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

现在您可以向服务字典询问类型:

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

如果返回true,那么您知道componentDictionary将包含实现该服务的组件:

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

通过智能地使用抽象基类型和泛型,您可以创建一个比这更强类型的解决方案。但是,这应该可以很好地工作,尽管有铸造。

答案 1 :(得分:0)

在Java中,有一个 MultiMap 类,它支持每个键的多个值。我相信你也可以为C#找到类似的数据结构。