需要一些帮助来尝试解决基于参数在运行时解决服务实现的问题。换句话说,使用带有 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); } }
问题是运行时参数被用于构建服务并在运行时解析。IE
var service = resolvedServiceClass.Factory("runtime parameter")
所有这一切都会给我提供在构造函数中使用“运行时参数”的“服务”。
我也看过键控或命名分辨率。
起初我以为我可以将这两种技术结合起来——但控制器依赖于接口——而不是具体的实现。(正如它应该)
任何关于如何解决这个问题的想法都将不胜感激。