【发布时间】:2016-06-16 18:11:00
【问题描述】:
在尝试解决基于参数在运行时解决服务实现的问题时需要一些帮助。换句话说,使用带有 DI 的工厂模式。
我们已将 Autofac 连接到我们的 MVC 应用程序。我试图弄清楚我们如何使用用户会话变量(称之为订购类型)用于依赖解析器来解决服务的正确实现。
我们正在尝试做的一个例子。
该应用程序有两种“类型”的订购 - 真正的电子商务订购类型(将商品添加到购物车、结帐等)。
另一种称为预测排序。用户创建订单 - 但他们不会立即得到履行。他们经过批准程序,然后完成。
底线是应用程序根据订单类型更改的数据架构和后端系统。
我想做的是:
-
我有 IOrderManagerService
public interface IOrderManagerService { Order GetOrder(int orderNumber); int CreateOrder(Order order); } -
因为我们有两个排序“类型”——我有两个 IOrderManagerService 的实现:
public class ShelfOrderManager : IOrderManagerService { public Order GetOrder(int orderMumber) { ...code } public int CreateOrder(Order order) { ...code } }
和
public class ForecastOrderManager: IOrderManagerService
{
public Order GetOrder(int orderMumber)
{
...code
}
public int CreateOrder(Order order)
{
...code
}
}
-
我的第一个问题是 - 在我的 MVC 应用程序中 - 我是否将这些实现注册为?
builder.RegisterType<ShelfOrderManager>().As<IOrderManagerService>(); builder.RegisterType<ForecastOrderManager>().As<IOrderManagerService>(); -
我们计划做的是在用户会话中坚持用户选择的订购类型。当用户想要查看订单状态时——取决于他们选择的订购“类型”——我需要解析器为控制器提供正确的实现。
public class OrderStatusController : Controller { private readonly IOrderManagerService _orderManagerService; public OrderStatusController(IOrderManagerService orderManagerService) { //This needs to be the correct implementation based on the users "type". _orderManagerService = orderManagerService; } public ActionResult GetOrder(int orderNumber) { var model = _orderManagerService.GetOrder(orderNumber); return View(model); } }
我已经准备好了the delegate factory 和this answer 很好地解释了这个概念。
问题是运行时参数被用于构建服务并在运行时解析。即
var service = resolvedServiceClass.Factory("runtime parameter")
所有这一切都会为我提供在构造函数中使用“运行时参数”的“服务”。
我也看过Keyed or Named 分辨率。
起初我以为我可以将这两种技术结合起来——但控制器依赖于接口——而不是具体的实现。 (应该)
任何有关如何解决此问题的想法将不胜感激非常。
【问题讨论】:
标签: asp.net-mvc runtime autofac dependency-resolution