1

注文をデータベースに保存するために Linq To SQL を使用する、よく使用する電子商取引コードがあります。密結合された Linq to SQL ビットを削除し、代わりに IRepository を渡したいのですが、まだ少し混乱しています。

Customer オブジェクトを返す ICustomerRepository に GetCustomer() メソッドがあるとします。

そのメソッドから返される ICustomer オブジェクトを実際に返す必要があるので、Linq から SQL に切り替えて SubSonic と言っても問題ありませんか?

その場合、Linq To SQL で、Linq To SQL Customer オブジェクトを SubSonics ExecuteSingle(Of ) メソッドのような ICustomer オブジェクトに簡単に変換する方法はありますか?

4

3 に答える 3

3

CustomerクラスをLINQにアタッチされていないプレーンオブジェクトにしたい場合は、ほとんどの場合、マッパーメソッドを記述してLINQベースのCustomerオブジェクトをプレーンなCustomerドメインオブジェクトに変換する必要があります。LINQ to SQLには、このような機能は組み込まれていません。

読みやすくするために、マッピングメソッドを拡張メソッドでラップし始めました。これは、リポジトリコードを単純に保つのに非常に役立ちます。たとえば、CustomerRepositoryメソッドの例は次のようになります。

public Customer GetById(int id)
{
   return dataContext.LINQCustomers.Where(c => c.Id == id)
                                   .Single()
                                   .ToDomainObject();
}

ToDomainObject()メソッドは、次のような拡張メソッドで定義されます。

public static class ObjectMapper
{
    public static Customer ToDomainObject(this Customer linqObject)
    {
        var domainObject = null
        if (linqObject != null)
        {
            domainObject = new Customer
            {
               Id = linqObject.Id,
               FirstName = linqObject.FirstName,
               LastName = linqObject.LastName
            }
        }
        return domainObject;
    }
}

または同様のもの。同じことを実行して、ドメインオブジェクトをLINQオブジェクトに変換し直し、永続化のためにリポジトリに戻すことができます。

于 2009-02-07T23:29:34.427 に答える
1

Customer が単純な古い .NET オブジェクトであり、db によって生成されたエンティティではない限り、Customer を返すようにすることができます。Customer ドメイン オブジェクトは、データベースに永続化する方法 (または永続化するかどうか) についての知識を持たない必要があり、これがリポジトリから返される必要があります。リポジトリには、[データをその保存場所から取得する] からドメイン オブジェクトにマップするマッピング コードがいくつかある場合があります (これは非常に一般的です)。Linq-to-sql を使用している場合、このマッピングは Linq-To-Sql で生成された Customer テーブル (およびおそらく他のテーブル - Customer ドメイン オブジェクトはデータベース内の特定のテーブルに 1:1 でマッピングされない可能性があります) からのものになります。 ) を別の名前空間 (およびほとんどの場合、アセンブリ) に存在する Customer ドメイン オブジェクトに変換します。

于 2009-02-07T21:17:27.360 に答える
1

ICustomer にする必要はまったくありません。リポジトリは、永続インスタンスがメモリ内にあるかのように見せるように機能します。

public interface ICustomerRepository
{
  Customer GetByID(int id);
  IEnumerable<Customer> GetByName(string name);
  Customer GetByVatCode(string vatCode);
}

一部の人々は、次のようなメソッドをさらに含めるでしょう

void Add(Customer newCustomer);
void Delete(Customer deleted);
void Update(Customer modified);

後者のメソッドの実装は、ほとんどの場合、作業単位を更新するだけです。

ただし、概念は、これらは Customer インスタンスを要求する一般的な方法に過ぎないということです。リポジトリは、それらを要求する方法を定義せずに、それらを要求する方法として機能します。

于 2009-02-07T21:25:31.697 に答える