所以在高层次上我理解了依赖注入的概念。我们公司希望采用这种做法,我认为这是一个好主意,但我需要更多信息并提出一些问题。
什么是好的或最受欢迎的依赖注入容器?我听说过ninject,这对.NET 4 Webforms有效吗? Microsoft是否拥有可能更好的专有DI容器?
我们的应用程序结构如下:
以下是我们业务层的示例控制器:
public class OrderController
{
IOrderRepository _orderRepository;
public OrderController(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
public List<string> GetFilters()
{
// Return list of filters.
}
public List<Order> GetFilteredOrders(string filter)
{
switch (filter)
{
case "Newest":
return // Get orders sorted by newest first.
case "Oldest":
return // Get orders sorted by oldest first.
default:
return // etc etc etc
}
}
}
正如您所看到的,这需要IOrderRepository
的注入实例,以便于单元测试。 OrderController
当前在需要使用它的相应页面后面的代码中实例化。我们不想在我们实例化IOrderRepository
的每个的地方创建一个新的OrderController
,这是我们想要使用DI的地方。
实现此目的的最佳方法是什么? DI Container在什么时候接管并注入IOrderRepository
的实例?会不会有某种工厂,所以我可以做OrderController _orderController = OrderControllerFactory.Create()
或类似的事情?我有点失落。
如果我需要澄清一些事情,请告诉我。谢谢。
答案 0 :(得分:4)
我的首选是坚持使用Microsoft堆栈并使用Unity;虽然我有同事在项目上使用Ninject并喜欢它。
以下是我在Web应用程序中执行此操作的方法(MVC应用程序稍微涉及更多):
using Microsoft.Practices.Unity;
public class OrderController
{
IOrderRepository _orderRepository;
[InjectionConstructor]
public OrderController(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
public List<string> GetFilters()
{
// Return list of filters.
}
public List<Order> GetFilteredOrders(string filter)
{
switch (filter)
{
case "Newest":
return // Get orders sorted by newest first.
case "Oldest":
return // Get orders sorted by oldest first.
default:
return // etc etc etc
}
}
}
///
/// From Global.asax.cs
using Microsoft.Practices.Unity;
private void ConfigureUnity()
{
// Create UnityContainer
IUnityContainer container = new UnityContainer()
.RegisterInstance(new OrderController())
.RegisterType<IOrderRepository, OrderRepository>();
// Set container for use in Web Forms
WebUnityContainer.Container = container;
}
///
/// Creating the OrderController from your Web UI
public OrderController CreateOrderController()
{
return WebUnityContainer.Container.Resolve<OrderController>();
}
///
/// Shared static class for the Unity container
using Microsoft.Practices.Unity;
namespace MyCompany.MyApplication.Web
{
public static class WebUnityContainer
{
public static IUnityContainer Container { get; set; }
}
}
答案 1 :(得分:0)
在此处使用结构图。
http://structuremap.net/structuremap/
在结构图中,它是这样的:
ObjectFactory.GetInstance(Of OrderController)
关于结构图的好链接:
Which .NET Dependency Injection frameworks are worth looking into?
开源应用:
使用Unity,另一个良好的依赖注入框架:http://kigg.codeplex.com/
我在1〜2年前遇到过同样的问题,从那时起我就一直在使用StructureMap,我很高兴但是我知道像Ninject这样的其他框架和StructureMap一样好。