如何移植Unity';将流畅的配置转换为XML配置

本文关键字:配置 转换 XML Unity 何移植 | 更新日期: 2023-09-27 18:20:07

我在控制器中使用构造函数注入,通过在DI容器中注册的contextFactory处理多个上下文(首先是EF代码)。我有3个ProductXContexts,它们继承自我的CoreContext。我把每个上下文都放在一个单独的项目中。目前,它们都在我的MCV项目中被引用。我想保留引用的基本上下文(CoreContext),但删除ProductXContext引用,并在运行时使用Unity来解析和注入依赖关系。

目前我正在使用fluent配置来设置我的容器:

var container = new UnityContainer();
container.RegisterType<CoreContext>(new InjectionFactory(c => ContextFactory.CreateContext()));

上下文工厂如下所示:

public static CoreContext CreateContext()
{
    var userProduct = HttpContext.Current.Session["Product"] as string;
    CoreContext context;
    switch (userProduct)
    {
        case null:
            throw new Exception("No product is selected. Can't define an appropriate context.");
        case "Product 1":
            context = new Product1Context();
            break;
        case "Product 2":
            context = new Product2Context();
            break;
        case "Product 3":
            context = new Product3Context();
            break;
        default:
            throw new Exception("Current product is not supported. Can't define an appropriate context.");
    } 
    return context;
}

控制器是这样的:

public class MyController : Controller
{
    private CoreContext _context;
    public MyController(CoreContext context)
    {
        _context = context;
    }
...
}

因此,如果我要从MVC项目中删除ProductXContext引用,我似乎必须切换到XML配置,因为为了编译流畅的代码,必须对所有代码都有引用。但我现在想到了:

  1. 如何在XML配置中声明InjectionFactory
  2. 如果我成功地声明了它,那么如何在我的ContextFactory中实例化ProductXContext,因为我不再引用它们了

PS:有没有一种方法可以使用XML配置注册外部类型,然后使用fluent配置声明injectionFactory?

提前感谢!

如何移植Unity';将流畅的配置转换为XML配置

如果您需要在不直接引用ProductXContext项目的情况下支持后期绑定,则有其他解决方案。TecX项目包含Unity的增强配置引擎,允许您扫描程序集以查找特定类型的实现,并自动注册它们。它还有一个来自温莎城堡的名为Typed Factories的功能,可以自动生成像您的ContextFactory这样的工厂。