0

我有一个使用 linq-to-sql 查询(即将升级为 linq-to-EF 编译查询)的 Web 应用程序,并且已经有数据上下文和数据库。我想创建应用程序的演示版本,对于演示,我想使用一个完全不同的数据库文件,但它具有相同的表。因此,本质上,我将为两个不同的数据库使用相同的数据结构:一个用于登录用户的数据库,一个用于演示用户的数据库。我想重用我已经写过的许多查询;它们看起来像这样:

 public class FruitQueries
 {
        public List<SomeObjectModel> MyQuery(list of parameters)
        {
           using (MyDataContext TheDC = new MyDataContext())
           {
              var TheQueryResult = (from f in TheDC.Fruits
                                    ......).ToList();

              return TheQueryResult;
           }
        }

        public List<SomeObject> AnotherQuery(some other parameters) {...}
 }

现在我想我知道这需要依赖注入,其中数据上下文作为参数传入,但我不确定语法。如何使用依赖注入重用查询以使它们在两个不同的数据库上工作?现在我正在使用一个using语句,我想保持这种模式;如果我将 DC 作为参数注入,这可能吗?

谢谢。

4

2 回答 2

1

由于您已经有很多代码,可能最简单的方法是注入一个工厂:

public interface IMyDataContextFactory
{
    MyDataContext CreateNewContext();
}

所有代码将大致保持不变:

public List<SomeObjectModel> MyQuery(params)
{
   using (var TheDC = this.factory.CreateNewContext())
   {
      var TheQueryResult = (from f in TheDC.Fruits
                            ......).ToList();

      return TheQueryResult;
   }
}

您可以让注入IMyDataContextFactory者决定如何构建MyDataContext实例(基于用户)。这将是微不足道的。

MyDataContext最后,将 a (或诸如 的抽象)注入消费者可能会更好IUnitOfWork,但这会彻底改变一切。由于这个类是从外部传入的,消费者不再负责处理它,而是由其他人负责。尽管使用大多数 DI 容器处理这样的实例并不难。但是,当您想MyDataContext在多个消费者(例如在同一个 Web 请求中)共享同一个实例时,它会变得更加困难,并且您在哪里调用SubmitChanges

于 2012-11-17T12:09:04.520 回答
1

详细说明上一个答案

您可以做的是向 DC 提供连接字符串(这是否符合构造函数注入的条件?)

using (MyDataContext TheDC = new MyDataContext(this.factory.CreateConString()))

这样,处置仍然由消费者处理,您可以继续使用 Using() 方法。您的工厂可以从您的 webconfig 中读取两个不同的连接字符串,并根据用户确定要使用的正确连接字符串。(并不像看起来那么微不足道)

PS:我认为最快的方法是将演示应用程序部署到不同的 URL,这样它们就可以有一个单独的 web.config 并且您不需要编写任何代码,但这并不能回答您的问题。

于 2012-11-17T13:16:11.297 回答