Есть ли лучший способ реализации зависимостей? - PullRequest
0 голосов
/ 28 марта 2019

Ниже приведен мой пример использования:

Управление персоналом - это отдельный проект библиотеки классов C #. И есть настройка для управления сотрудниками на уровне приложений. Это означает, что есть глобальная логическая переменная isEmployeeManagement

Если переменная имеет значение true, тогда весь код, связанный с управлением, используемый во всем приложении, должен быть выполнен, например, для

IEmployeeManagement.AddUser();
IEmployeeManagement.DeleteUser();

Но если настройка ложна, тогда; нижеследующие строки не должны проходить через какие-либо исключения. Один из подходов, о которых я подумал, похож на проверку состояния.

If (isEmployeeManagement)
  IEmployeeManagement.AddUser();

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

Благодарим вас за помощь в реализации.

1 Ответ

1 голос
/ 28 марта 2019

Итак, если у вас есть интерфейс IEmployeeManagement:

public interface IEmployeeManagement {
    void AddUser();
}

И тогда у вас есть ваш класс, который его реализует:

public class RealManagement : IEmployeeManagement {
    public void AddUser() {  do lots of stuff  }
}

Вместо наличия условия if для каждого вызова AddUser,создайте другую реализацию интерфейса:

public class VoidManagement : IEmployeeManagement {
    public void AddUser() {  do nothing  }
}

Таким образом, вам не нужно будет выполнять условия для каждого вызова метода, а вместо этого вы будете делать это только при инициализации класса.

Если вы используетекакая-то структура внедрения зависимостей, эту логику можно установить только один раз вместо каждого при создании класса.

Если настройка относится ко всему уровню приложения, для всех пользователей у вас может быть что-то подобное

Startup.cs (при условии .net core):

public void ConfigureServices(IServiceCollection services)
        {
            if(Configuration["isEmployeeManagement"] == "true") {
                services.AddTransient<IEmployeeManagement>(RealManagement);
            } else {
                services.AddTransient<IEmployeeManagement>(VoidManagement);
            }
        }

Как точно выполнить инициализацию правильных изменений экземпляра в зависимости от того, как вы получаете это isEmployeeManagement, каков срок службы службы и чтоDI библиотека, которую вы используете, если используете что-либо.Но общая идея одна и та же - две реализации интерфейса вызывают методы там, где вам нужно, но используют некую логику для правильной инициализации экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...