Есть ли лучший подход для решения этого простого бизнес-сценария? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующий интерфейс:

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 */ }
}

Но проблема в том, что некоторые классы валидатора имеют точно такую ​​же логику / код.Я подумал о том, что:

  1. Вместо интерфейса создал абстрактный класс и сохранил там общий код
  2. Классы валидаторов, которые имеют различную реализацию, переопределяют абстрактный класс.

Теперь мои вопросы:

  1. Хотя вышеприведенное работает нормально, есть ли лучший подход / шаблон проектирования, более подходящий для вышеописанного сценария?
  2. Я использую Autofac, как показано ниже, он работает нормально, но есть ли какие-либо проблемы, которые вы можете предвидеть?

    builder.RegisterType (). As (). Keyed (EntityType.Shop);

    // аналогично другим валидаторам.

1 Ответ

0 голосов
/ 03 октября 2018

Лично мне нравится ваше первоначальное предложение.Некоторые, вероятно, не согласятся, но мне нравится симметрия создания класса для каждого типа сущности, даже если некоторые из этих классов не имеют кода.

То есть, если есть какой-то общий код, я бы использовал ваше предложениепреобразования интерфейса в базовый класс и размещения вашего общего кода там.(Очень похоже на CException.)

Конечно, если общий код более сложный, то у вас могут быть более специализированные базовые классы, из которых ваш конечный класс может быть получен, но в этом случае он не столь элегантен.

...