在数据访问层中使用DI的更好方法

时间:2019-03-29 10:55:03

标签: c# dependency-injection solid-principles

我已经使用Unity创建了一个简单的3层架构来实现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;
    }

所有案例都有不同的查询,在这些不同的查询中,我使用部门ID提取计数。我担心的是,每当要添加新部门时,我都必须在Switch中添加新查询以及新案例。

有没有比这更好的方法了?

0 个答案:

没有答案