0

私は、linq-to-sql クエリを使用する Web アプリケーションを持っており (間もなく linq-to-EF コンパイル済みクエリにアップグレードされます)、データ コンテキストとデータベースが既に配置されています。アプリケーションのデモ バージョンを作成したいと考えています。デモ用に、まったく異なるデータベース ファイルを使用したいと考えていますが、それには同じテーブルが含まれます。したがって、基本的には、2 つの異なるデータベース (ログイン ユーザー用のデータベースとデモ ユーザー用のデータベース) に対して同じデータ構造を使用します。既に作成したクエリの多くを再利用したいと考えています。それらは次のようになります。

 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) {...}
 }

これで、データ コンテキストがパラメーターとして渡される依存性注入が必要になることがわかったと思いますが、構文についてはわかりません。依存性注入を使用してクエリを再利用し、2 つの異なるデータベースで動作させるにはどうすればよいでしょうか? 現在、私は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(またはのような抽象化)を注入する方がおそらく良いでしょうが、これはすべてを完全に変えます。IUnitOfWorkこのクラスは外部から渡されるため、消費者はそれを処分する責任を負いませんが、他の誰かが責任を負います。このようなインスタンスを破棄することは、ほとんどのDIコンテナではそれほど難しくありませんが。MyDataContextただし、同じインスタンスを複数のコンシューマー間で共有する場合(たとえば、同じWebリクエスト内)、どこに電話するのSubmitChangesかが難しくなります。

于 2012-11-17T12:09:04.520 に答える
1

前の回答を詳しく説明する

あなたができることは、接続文字列を DC に提供することです (これはコンストラクター インジェクションと見なされますか?)

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

このように、廃棄は引き続き消費者によって処理され、Using() アプローチを続行できます。ファクトリは、webconfig から 2 つの異なる接続文字列を読み取り、ユーザーに基づいて使用する適切な接続文字列を決定できます。(見た目ほど些細なことではありません)

PS: 最も簡単な方法は、デモ アプリケーションを別の URL にデプロイして、別の web.config を持つことができるようにすることだと思います。何もコーディングする必要はありませんが、それでは質問の答えにはなりません。

于 2012-11-17T13:16:11.297 に答える