如何根据id(服务定位器模式)定位服务?

时间:2014-04-28 16:17:58

标签: c# asp.net-mvc design-patterns inversion-of-control unity-container

我有不同的服务,每个服务都有不同的类型。例如,UpdateService有三种不同的类型(HighFreq,MediumFreq,MinFreq)。

我已经为我的服务和我的类型做了一个例子:

 public enum UpdateServiceType: byte
  {

    MinUpdateFreq= 1,

    MediumUpdateFreq = 2,

    HighUpdateFreq = 3

   }

public enum MyServices: byte
 {

    UpdateService = 1,

    SpecialService= 2,

    }

然后关于在数据库上保存服务和相关类型的条件,如:

serviceId= 1
ServiceType =2

现在我想创建每个服务,但我不知道使用哪种模式:工厂模式,服务定位器,甚至我不知道我是否做了正确的使用枚举的事情?

我应该使用什么而不是枚举?我应该如何创建适当的服务?什么是最佳做法?在这种情况下,如何使用像团结一样的ioc?

更新

阅读Mark Seeman的精彩帖子后,我发现Metadata Role Hint适合我的问题,因为它明确地描述了这个类。但后来我又遇到了另一个问题。标记建议的工厂是这样的:

public class UpdatePackageFactory : UpdatePackageFactory
{
    private readonly IEnumerable<IUpdatePackage> _candidates;

    public UpdatePackageFactory(IEnumerable<IUpdatePackage> candidates)
    {
        _candidates = candidates;
    }

    public IUpdatePackage GetUpdatePackage(UpdateFreq UpdateFreq)
    {
        return (from c in this._candidates
                let handledMethod = c.GetType().GetCustomAttribute<HandleUpdateFreqAttribute>()
                where handledMethod != null && handledMethod.UpdateFreq == UpdateFreq
                select c).SingleOrDefault();
    }


}

它需要和枚举像

public enum UpdateFreq : byte
{

    MinUpdateFreq= 1,

    MediumUpdateFreq = 2,

    HighUpdateFreq = 3

}

但是现在我想建立另一家工厂,使上面的工厂成为工厂,它自己依赖于像enum这样的工厂

 public enum ServiceFactory: byte
{

    UpdateService= 1,

    SpecialService = 2,

    HighUpdateFreq = 3

}

使用上面提到的方法我可以建造另一个建造工厂的工厂,但问题是每个工厂都有自己的枚举如何让工厂接受不同的工厂。例如,这将是我工厂的一个方法,它采用两个枚举作为参数,第一个永远是myservices,但第二个参数将改变与工厂的比例。有一次它可能是updateFreq,另一次是specialType或.....

  public IUpdatePackage GetUpdatePackage(MyServices myServices,UpdateFreq updateFreq )
    {

    }

或者在这里做另一个例子Abstract Factory工厂有枚举

enum MANUFACTURERS
{
    NOKIA,
    SAMSUNG,
    HTC,

 }

但是,如果每个工厂再次拥有自己的枚举,例如NokiFactory接受带有不同项目的枚举,Htc接受另一个具有不同命名的枚举,依此类推。

我应该怎么写这样的工厂?

0 个答案:

没有答案