我已经使用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中添加新查询以及新案例。
有没有比这更好的方法了?