设计依赖注入和重用单个datacontext

时间:2010-08-17 15:22:33

标签: c# linq-to-sql dependency-injection architecture

我目前刚刚开始实施依赖注入,所以我可以开始测试我的代码并且多次遇到一个我无法弄清楚的问题。

我目前的情况:

我有一个单独的类(foo.cs),它在Windows服务运行的整个过程中都是活动的。它负责轮询db以获取新消息,然后将其发送出去并更新数据库以反映发送的成功。

我的问题是foo.cs对数据访问具有依赖性(Message Repository - linq-to-sql数据上下文),因此它通过构造函数注入,其生命周期范围与foo相同。我正在阅读的所有地方都说数据上下文生命周期应该是一个单独的工作单元。所以它就像我需要注入我想要使用的实际类型并在每次我想在foo中执行单个工作单元时构造它,而不是传递已经构建的存储库,该存储库在整个服务期间保持活动。 / p>

2 个答案:

答案 0 :(得分:4)

一种可能性:不要在构造期间直接给Foo类一个数据上下文,而是给它一个数据上下文'factory'类/接口,它实现一个方法,在每次调用时创建一个新的数据上下文。

<强> **编辑**

如果我的描述不清楚,这里是我的意思草图:

interface IDataContextFactory
{
    ??? CreateContext();
}

class DataContextFactory : IDataContextFactory
{
    public ??? CreateContext()
    {
        // Create and return the LINQ data context here...
    }
}

class Foo
{
    IDataContextFactory _dataContextFactory;

    public Foo(IDataContextFactory dataContextFactory)
    {
        _dataContextFactory = dataContextFactory;
    }

    void Poll()
    {
        using (var context = _dataContextFactory.CreateContext())
        {
            //...
        }
    }
}

答案 1 :(得分:2)

reference讨论了各种替代方案。如果您的处理是有效的一系列全有或全无UOW,那么全局上下文实际上可能是正常的。如果您具有更高的复杂性,那么引用文章中的每个线程或工厂等方法可能更合适。在后一种情况下,您将注入工厂而不是上下文。