11

Simple Injectorを使用してリポジトリを作成し、それをビジネスロジックレイヤーで使用しようとしています(PerWebRequestメソッドを使いたい)。Simple injector、Repository and Contextコードの使い方

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Delete(int id); 
    void Update(T entity); 
    T GetById(int Id); 
    IQueryable<T> All(); 
    IEnumerable<T> Find(Func<T, bool> predicate); 
} 

と::

public class EFRepository<T> : IRepository<T>, IDisposable where T : class 
{ 
    #region Members 
    protected DbContext Context { get; set; } 
    protected DbSet<T> DbSet { get; set; } 
    #endregion 

    #region Constructors 

    public EFRepository(DbContext dbContext) 
    { 
     if (dbContext == null) 
      throw new ArgumentNullException("dbContext"); 
     Context = dbContext; 
     DbSet = Context.Set<T>(); 
    } 

と私のコンテキスト:私はDAL層で

public class PASContext : DbContext, IDbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<User> Users { get; set; } 

    public PASContext() 
     : base("PostAndSell") 
    { } 
} 

あなたはEFRepository、1つを取るだけで1つのコンストラクタを持って見ることができるように引数 - これは、私がコンテキストとpのインスタンスを作成するためにSimple Injectorを使用したいからですそれが作成されている間、リポジトリに尻込みます。

BLLにはクラスProductBLLがあります。データベースからそのクラスのすべての製品(一部のGetAllメソッドを含む)を取得して渡したい場合は、HomeControllerに伝えてください。

私は本当にこのことを通して私に話す人が必要です。

私は、私のglobal.asax.csファイルでもnuger(シンプルインジェクターとシンプルなインジェクターASP.NET統合)

から右のパッケージをインストールして起動さApplication_Start()機能の下I`veが追加さ:

var container = new SimpleInjector.Container(); 

container.RegisterPerWebRequest<IRepository<Product>, EFRepository<Product>>(); 

ただし、どこでContextインスタンスを作成しますか?どのように私はビジネス層でそれにアクセスできますか?

答えて

16

あなたはおそらく、(など製品、顧客、従業員、のための)多くのIReposotory<T>の実装を持っていますので、それはこのようなIRepository<T>のための単一のオープンジェネリック登録を行う方が良いでしょう:

スコープライフスタイルは次のように定義されて
container.Register(typeof(IRepository<>), typeof(EFRepository<>), Lifestyle.Scoped); 

container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

この登録は簡単なインジェクタはEFRepository<Product>IRepository<Product>が要求されるたびに、012のためのEFRepository<Customer>返されることを保証しますなどがあります。

あなたが同じDbContextインスタンスが同じリクエスト内のすべてのリポジトリ上で使用されるようにしたいので、あなたはまた、スコープのライフスタイルとDbContext登録する必要があります:私はクラスProductBLLを持っBLLに

container.Register<DbContext, PASContext>(Lifestyle.Scoped); 

をそして私は、データベースからすべての製品に を取得し、それを渡したい、にHomeController

そのシナリオでは

を言うことができます、このProductBLLはリクです私にとって役に立たない抽象化。すべてのデータがデータを通過している場合は、簡単にHomeControllerIRepository<Product>に依存させることができます。

+0

ありがとうございます。しかし、BLLに論理を持つクラスがある場合、どうすればリポジトリを使用できますか?私のコンセプトは、BLLはリポジトリを介してDALと会話し、MVCはproductBLLのようなクラスを通じてBLLと会話することです。また、私はHomeControllerでこのリポジトリにアクセスしたいのですがどうすればいいですか? EFがデータベースを作成するときは? – jony89

+1

BLLクラスを持つことは、実際にロジックがある場合にのみ有効です。しかし、もしあなたがロジックを持っていれば、プロダクトではなくコントローラにProductBLLを注入する必要があります(あるいは、追加された動作がロギング、セキュリティ、バリデーションなどのクロスカッティングの問題のみである場合は、代わりにIRepositoryのデコレータ)。コントローラ内のレポにアクセスするには、IRepository をコントローラに挿入するだけです。それについては何も気にしない。それだけで動作します。 – Steven

+0

私はこれでかなり初心者です。私は単にIRepository をコントローラーに "注入"することはできますか?どのコードが "注射"という単語に関連していますか? 'productBLL'のRepostiroyにアクセスしてコントローラに注入する方法 - これに関連するコードをいくつか表示してください。さらに、私はまだ 'PASContext'のインスタンスが' EFRepository'コンストラクタに渡される場所を見ています。いつデータベースが作成されるのでしょうか?これはコードファーストプログラムなので、 – jony89

関連する問題