У меня есть разные службы, каждая из которых имеет разные типы. Например, 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 принимает другое перечисление с другим именем и так далее.
Как мне написать такую фабрику?