Лучший способ использовать DI на уровне доступа к данным

#c# #dependency-injection #solid-principles

#c# #внедрение зависимостей #solid-принципы

Вопрос:

Я создал простую 3-уровневую архитектуру, используя Unity для достижения DI. Но все же я хочу знать, как я могу еще больше улучшить код, в частности, уровень доступа к данным. Мое приложение просто получает некоторые входные данные от пользователя, а затем извлекает данные из базы данных на уровне доступа к данным.

   public class Program
  {
     static void Main(string[] args)
     {
        Bootstrapper.Init();
        Initiator initiator = DependencyInjector.Retrieve<Initiator>();

        Console.Write("Enter Department Id: ");
        int departmentId = Convert.ToInt32(Console.ReadLine());

        int count = initiator.FetchData();
        Console.WriteLine(count);
        Console.ReadLine();
     }
 }

 public static class Bootstrapper
 {
    public static void Init()
    {
       DependencyInjector.Register<IBusiness, BusinessClass>();
       DependencyInjector.AddExtension<DependencyOfDependencyExtension>();
    }
 }

public class DependencyOfDependencyExtension : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IData, DataClass>();
    }
}

 public static class DependencyInjector
 {
    private static readonly UnityContainer UnityContainer = new UnityContainer();
    public static void Register<I, T>() where T : I
    {
        UnityContainer.RegisterType<I, T>(new ContainerControlledLifetimeManager());
    }
    public static void InjectStub<I>(I instance)
    {
        UnityContainer.RegisterInstance(instance, new ContainerControlledLifetimeManager());
    }
    public static T Retrieve<T>()
    {
        return UnityContainer.Resolve<T>();
    }
    public static void AddExtension<T>() where T : UnityContainerExtension
    {
        UnityContainer.AddNewExtension<T>();
    }
 }
  

На уровне доступа к данным я вызываю следующий метод:

  public int GetCount(int departmentId)
    {
        int count = 0;
        switch (departmentId)
        {
            case 10001:
                // select query
                break;
            case 10002:
                // select query
                break;
            case 10003:
                // select query
                break;
            case 10004:
                // select query
                break;
            case 10005:
                // select query
                break;
            default:
                break;
        }

        return count;
    }
  

У всех случаев разные запросы, и в этих разных запросах я извлекаю количество, используя идентификатор отдела. Меня беспокоит то, что каждый раз, когда добавляется новый отдел, мне приходится добавлять новые запросы, а также новый регистр в коммутаторе.

Есть ли способ лучше этого?

Комментарии:

1. Если это уже рабочий код и вы ищете предложения по улучшению, то этот вопрос лучше подойдет для codereview.stackexchange.com

2. Ваш вопрос не имеет ничего общего с DI. Мне кажется, вам просто нужно выполнить параметризованный sql-запрос.

3. @Crowcoder: Я не использую SQL-запросы напрямую вместо запросов Odata. Вот почему нельзя использовать параметризованные sql-запросы или хранимую процедуру.

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

5. @ScottHannen: В этом коде будут разные запросы с разными таблицами для извлечения количества и ничего более. Теперь в этом проблема, поскольку для каждого идентификатора отдела у меня есть свой набор запросов, я должен проверять их, выполнять и возвращать данные, используя регистр переключения. Я искал лучший подход для этого.