【问题标题】:Web API + Unity - Reference object dbcontext already instantiatedWeb API + Unity - 参考对象 dbcontext 已经实例化
【发布时间】:2015-11-12 18:47:41
【问题描述】:

我正在使用 Unity 进行依赖注入。

我有一个方法负责实例化数据库对象,如下所示:

        container.RegisterType<DB>(
            new InjectionFactory(c =>
            {
                return new DB();
            })
        );

问题是,我有一个方法使用两个不同的对象,这些对象应该被引用到同一个数据库实例,但看起来 Unity 在每次注入时都会创建一个新的数据库对象实例。

查询 LINQ 示例:

var test = from tb1 in _db1.method()
           join tb2 in _db2.method() on tb1.code equals tb2.code

_db1 和 _db2 引用相同的 DB 对象如下

    DB _db = null;

    public db1(DB dataContext)
    {
        _db = dataContext;
        _db.CommandTimeout = 3600;
    }

所以我收到以下错误:

查询包含对在不同数据上下文中定义的项目的引用

有人可以帮我修复 Unity 寄存器以引用已经实例化的 DB 对象,而不是每次都创建一个新对象吗?

【问题讨论】:

    标签: c# linq asp.net-web-api dependency-injection unity-container


    【解决方案1】:

    您应该将您的数据库注册为容器中的单例,这意味着每次请求数据库时都会返回相同的实例,这是:

    container.RegisterType<DB>(new ContainerControlledLifetimeManager())
    

    应该这样做,如果这是一个 Web 应用程序,您可能应该为每个请求创建一个子容器,有不同的方法可以做到这一点,但您可能想尝试一下 https://www.nuget.org/packages/Unity.Mvc4/

    【讨论】:

    • 现在,当我注册一个依赖项时,我正在使用以下代码:container.RegisterType&lt;IAdminDB, AdminDB&gt;(new HierarchicalLifetimeManager()); HierarchicalLifetimeManager() 应该替换为 ContainerControlledLifetimeManager()?
    • 像你说的那样我开始得到这个错误:An error occurred when trying to create a controller of type 'ExampleController'. Make sure that the controller has a parameterless public constructor."。我没有想法。
    • @MarceloBarbosa,您是否在容器中注册了ExampleController?你能展示构造函数ExampleController 的样子吗?你能展示你如何使用容器来解析对象吗?您使用的是IDependencyResolver 还是IHttpControllerActivator
    • 默认情况下,unity 使用 TransientLifetimeManager,因此每次对实例提出请求时都会创建一个新实例。 HierarchicalLifetimeManager 和 ContainerControlledLifetimeManager 只创建一个请求类型的实例并重用它。当您使用子容器时,最后一个之间的区别是相关的。 ContainerControlledLifetimeManager 将确保所有子容器使用相同的实例,并且使用 HierarchicalLifetimeManager 实例对于每个子容器都是唯一的。
    • 至于您的控制器异常,我认为这是一个单独的问题,您似乎没有正确地将容器与 mvc 管道连接起来,并且默认的 mvc 解析器不喜欢带参数的构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多