2

私のデータベースには、ある時点でビットマップに変換する必要のあるバイナリデータがあります。私は、リポジトリを使用してそれを行うのが適切かどうかを考えていました。私の消費者(プレゼンテーション層)は、このリポジトリを使用します。例:EFモデルとコードコンシューマの間のリポジトリの使用

// This is a class I created for modeling the item as is. 
public class RealItem 
{ 
    public string Name { get; set; } 
    public Bitmap Image { get; set; } 
} 

public abstract class BaseRepository 
{ 
    //using Unity (http://unity.codeplex.com) to inject the dependancy of entity context. 
    [Dependency] 
    public Context { get; set; } 
} 

public calss ItemRepository : BaseRepository 
{ 
    public List<Items> Select() 
    { 
     IEnumerable<Items> items = from item in Context.Items select item; 
     List<RealItem> lst = new List<RealItem>(); 
     foreach(itm in items) 
     { 
      MemoryStream stream = new MemoryStream(itm.Image); 
      Bitmap image = (Bitmap)Image.FromStream(stream); 
      RealItem ritem = new RealItem{ Name=item.Name, Image=image }; 
      lst.Add(ritem); 
     } 

     return lst; 
    } 
} 

これはリポジトリパターンを使用する正しい方法ですか?私は自分のソースコードを見たときに例えば...私はこのパターンを学んでいると私はオンラインの例をたくさん見てきたリポジトリを使用していることが、:

public IQueryable<object> Select 
{ 
    return from q in base.Context.MyItems select q; 
} 

あなたはほとんどない行動を見ることができるようにされますデータアクセスクエリを隠すことを除いて、彼らのアプローチによってシステムに追加されたので、私はリポジトリが何か他のものであると混乱してしまいました。最後には、それを使うという特別な利点があるはずです。

更新:あなたはデータを送信する前にデータを処理する必要がなければ、リポジトリは必要ありませんが、待ってください! LINQクエリの抽象化はありませんか?そうすれば、クライアントは私たちのために少し安全ではなく、検証が難しいクエリ文を提供しなければならないので、リポジトリはデータクエリの抽象化も提供していますか?これが本当であれば、リポジトリを持つことは、プロジェクト・アーキテクチャーにおいて常に必要不可欠なものです!! この抽象化は、SQLストアドプロシージャを使用することによって提供することができます。両方のオプションが利用可能な場合の選択肢は何ですか?

答えて

4

はい、これは正しい方法です。リポジトリ契約はアプリケーションのニーズに対応し、アプリケーションオブジェクトを使用します。

ほとんどの場合、(悪い)例は、リポジトリの実装をIQueryableに結合します。これは、基礎となるormによって実装されていない可能性があります。

IQueryableとIEnumerableの違いは、リモートデータを処理する場合に重要ですが、リポジトリが最初に行うことです。つまり、リモートにできるストレージを処理しているという事実は隠れています。アプリケーションの場合、リポジトリはオブジェクトのローカルコレクションに過ぎません。

更新 リポジトリは永続アクセスを抽象化し、それは簡単なコレクションとして特定の永続化実装から切り離されたアプリケーションやマスク自体になります。つまり、Linq2Sql、Sql、または使用されているRDBMSの種類については、アプリケーションが認識していないことを意味します。アプリはレポからオブジェクトを送受信しますが、レポは実際にオブジェクトを保持または読み込みます。アプリは、レポがどのようにそれを行うか気にしません。

私はリポジトリを非常に有用なパターンと考えています。アプリケーション(問題と解決策が定義され扱われる場所)とデータの保存/永続性の境界を示すため、保存されます。

+0

私の更新を確認してください。ありがとう。 – jim

+0

私の更新された回答を参照してください – MikeSW

1

あなたはリポジトリを一般的なものにすることができ、そこからモード値を得ることができます。また、インターフェース(IItemRepository)を使用してマネージャー層のリポジトリーにアクセスし、新しいリポジトリー実装を使用してリポジトリーを別のデータ・アクセス方法で置き換えることができるようにしてください。 Here is an good exampl eこれを行う方法。

+0

あなたはアップデートを見て、あなたの意見を教えていただけますか? – jim