Как найти базу сервисов по идентификатору (шаблон локатора сервисов)?

У меня есть разные службы, каждая из которых имеет разные типы. Например, 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-подобный Unity в этой ситуации?

Обновление:

Прочитав отличную публикацию Марка Симана, я считаю, что Подсказка о ролях метаданных подходит для моей проблемы потому что он явно описывает класс. Но тут я снова столкнулся с другой проблемой. фабрика, предложенная маркой, выглядела примерно так:

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

}

Но теперь я хочу создать еще одну фабрику, которая делает вышеуказанную фабрику фабрикой, которая сама зависит от перечисления, например

 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 принимает другое перечисление с другим именем и так далее.

Как мне написать такую ​​фабрику?


person Amir Jalali    schedule 28.04.2014    source источник
comment
Связанный: stackoverflow.com/a/22705794/126014   -  person Mark Seemann    schedule 28.04.2014
comment
См. Также: stackoverflow.com/a/1927167/126014   -  person Mark Seemann    schedule 28.04.2014
comment
@MarkSeemann Я прочитал ваш отличный пост на эту тему и несколько других, вроде того, что у Келли Соммерс была аналогичная проблема blog.ploeh.dk/2011/12/19/FactoryOverload, но не нашел решения, которое показывает, как этого добиться с помощью двух разных перечислений.   -  person Amir Jalali    schedule 30.04.2014
comment
Я не уверен, что понимаю, чем эта проблема отличается от первой ... Однако в целом подумайте о том, чтобы спроектировать свою систему так, чтобы она полагалась на полиморфные типы, а не на перечисления: stackoverflow.com/a/2268571/126014 Кроме того, вы всегда можете использовать шаблон" Абстрактная фабрика ": stackoverflow.com/a/2269105/126014   -  person Mark Seemann    schedule 30.04.2014