У меня есть следующий интерфейс:
public interface IValidator
{
// Checks whether the selected roles are Valid based on Buisness rules for the
// specific EntityValidator
bool HasCompleteValidSelection(
ICollection<Role> availableRoles, ICollection<Role> selectedRoles);
//Checks whether the available roles are Valid for the specific entity
bool HasValidRoles(ICollection<Role> availableRolesList);
//Computes the Remaining Roles that needs to be selected to make it a Valid selection
ICollection<Role> GetRemainingRoles(
ICollection<Role> availableRoles, ICollection<Role> selectedRoles);
}
Теперь у меня есть куча EntityTypes, упомянутых в перечислении:
public enum EntityType
{
Shop= 1,
SmallBuisness= 2,
Corporation = 3,
Firm = 4,
Partnership = 5,
Unknown = 0
}
Все вышеперечисленные типы сущностей имеют свои соответствующие классы валидаторакоторый реализует IValidator.
public class ShopValidator : IValidator
{
public bool HasCompleteValidSelection(
ICollection<Role> availableRoles, ICollection<Role> selectedRoles)
{ /*implementation */ }
public bool HasValidRoles(ICollection<Role> availableRolesList)
{ /*implementation */ }
public ICollection<Role> GetRemainingRoles(
ICollection<Role> availableRoles, ICollection<Role> selectedRoles)
{ /*implementation */ }
}
Но проблема в том, что некоторые классы валидатора имеют точно такую же логику / код.Я подумал о том, что:
- Вместо интерфейса создал абстрактный класс и сохранил там общий код
- Классы валидаторов, которые имеют различную реализацию, переопределяют абстрактный класс.
Теперь мои вопросы:
- Хотя вышеприведенное работает нормально, есть ли лучший подход / шаблон проектирования, более подходящий для вышеописанного сценария?
Я использую Autofac, как показано ниже, он работает нормально, но есть ли какие-либо проблемы, которые вы можете предвидеть?
builder.RegisterType (). As (). Keyed (EntityType.Shop);
// аналогично другим валидаторам.