9

リポジトリ パターンに目を通したところ、過去に使用していたいくつかのアイデアに気づき、気分が良くなりました。

ただし、このパターンを使用するアプリケーションを作成したいと考えていますが、エンティティ クラスをリポジトリ プロバイダーから切り離したいと考えています。

私はいくつかのアセンブリを作成します:

  1. IRepository インターフェイスを含む共通インターフェイスをホストする「インターフェイス」アセンブリ
  2. Product、User、Order などのエンティティ クラスをホストする「エンティティ」アセンブリ。一部のメソッドはそのような型またはそれらの配列を返すため、このアセンブリは「Interfaces」アセンブリによって参照されます。また、メイン アプリケーション アセンブリ (Web アプリケーションなど) によっても参照されます。
  3. 1 つ以上のリポジトリ プロバイダー アセンブリ。それぞれに (少なくとも) IRepository インターフェイスを実装するクラスが含まれ、特定のデータ ストアで動作します。データ ストアには、SQL Server、Oracle サーバー、MySQL、XML ファイル、Web/WCF サービスなどを含めることができます。

すべてを実装するのにかかる時間の点で非常に生産的に見える LINQ to SQL を研究することは、生成されたクラスと CustomDataContext クラスの間の深い依存関係を発見するまではうまくいくようです。

このようなシナリオで LINQ to SQL を使用するにはどうすればよいですか?

4

9 に答える 9

6

これがまさにあなたが望むものであるかどうかはわかりませんが、RobConeryのMVCストアフロントコードを確認することをお勧めします。彼は、linqプロバイダーでリポジトリパターンのバリアントを使用しています。彼は、LINQ to Sqlオブジェクトをドメインオブジェクトにマップしてから、リポジトリプロバイダーからサービスレイヤーにドメインオブジェクトを返します。サービスレイヤーは、プロバイダーをラップして、ビジネスレイヤーに到達する前に返されたデータに対してロジックを実行できるようにします。

MVCストアフロントWebキャスト
コード

私には、プロバイダーにDTOを返してもらい、次にDTOをリポジトリー/サービスレイヤーのドメインオブジェクトにマップしたいように思えます。この場合、LINQ to SQLプロバイダーをDTOにマップし、それらを返してから、DTOをリポジトリ/サービスレイヤーのドメインオブジェクトにマップできます。これは問題なく機能するはずですが、2つのマッピングレイヤーがあるため、面倒になる可能性があります。

この場合、次のようになります。IProductRepositoryを受け取るProductService。DTOを取り戻すためにIProductRepositoryのメソッドを呼び出します。次に、DTOを実際のビジネスオブジェクトにマップし、それらを呼び出し元のコードに返します。

于 2008-10-23T15:56:22.540 に答える
5

データベースを任意のクラスにマッピングする外部 XML ファイルを作成できます。

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>

次に、XML を DataContext クラスに渡します。

 using (var cn = GetDbConnection())
  { var mappingSrc = XmlMappingSource.FromReader(xmlReader);

    using (var db = new DataContext(cn, mappingSrc))
     { var q = from entity in db.GetTable<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }
于 2008-10-24T07:33:33.397 に答える
3

POCO (Plain Old CLR Objects) のサポートが必要だと思います。LINQ to SQL には、 Close2Pocoというアダプターがあります。

しかし、Entity Framework に切り替えることをお勧めします。現時点ではPOCO アダプターもありますが、v2 ではすぐにサポートされると予想されます

于 2008-10-24T08:03:41.963 に答える
2

最も簡単な方法は、エンティティをデータコンテキストから切り離すことです。必要なエンティティをロードし、DataContextから切り離し、好きなように使用し、後でAttach()を使用してDataContextと結合して保存します。

残念ながら、LINQにはエンティティをデータコンテキストから分離する方法がありませんが、それらを複製するだけでうまく機能します。最も簡単な方法は次のようになります。

public static T CloneEntity<T>(T source)
{
  DataContractSerializer dcs = new DataContractSerializer(typeof(T));
  using (Stream stream = new MemoryStream())
  {
    dcs.WriteObject(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)dcs.ReadObject(stream);
  }
}
于 2008-10-24T08:19:29.513 に答える
2

私はWCFで似たようなことをしました

1 DBML で、シリアル化モードを単方向に設定します。

2 テーブルのすべての列を UpdateCheck=false に設定します

3 サービスを次のように記述します。

   public class Service1 : IService1
    {
        public Company GetCompany(int companyId)
        {
            using (DataClasses1DataContext dc = new DataClasses1DataContext())
            {
                return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
            }
        }

    public void SaveCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.Attach(company, true);
            dc.SubmitChanges();
        }
    }

    public void InsertCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.InsertOnSubmit(company);
            dc.SubmitChanges();
        }
    }
}

4 サービス参照を追加する

于 2008-10-24T17:48:39.867 に答える
2

LINQ to SQL で生成されたコードを使用する必要はありません。独自のクラスを必要な ColumnAttributes で修飾するか、外部の XML マッピング ファイルを使用できます。

于 2008-10-24T06:54:40.793 に答える
1

Entity クラスは、「Interfaces」アセンブリで宣言される IProduct、IUser、IOrder などのインターフェイスを実装できますか? このようにして、IRepository インターフェイスはビジネス オブジェクト インターフェイスのみを参照し (つまり、IProduct などのコレクションを返します)、"Interfaces" アセンブリは他の実装固有のアセンブリから切り離されます。

于 2008-10-23T14:50:51.113 に答える
1

まったく同じシナリオではありませんが、XML ファイルに基づいて OO モデルを生成するカスタム ツールの作成に取り組んでいます。私のアプローチは、舞台裏で LINQ to SQL を使用することです。コードを自動的に生成しているため、MySQL データ ソースなどの別のメカニズムを使用するのは簡単です。LINQ to SQL ではサポートされていないため、データ アクセス コードを手動で記述する必要がありますが、オブジェクト指向モデルを使用するクライアント コードは何らかの形で変更されます。

于 2008-10-23T13:59:12.697 に答える