11

Depoyu oluşturmak ve İş mantığı katmanında kullanmak için Simple Injector'ı kullanmaya çalışıyorum (ayrıca PerWebRequest yöntemini kullanmak istiyorum). DAL katmanında Basit enjektör, Deposu ve Bağlam nasıl kullanılır? Kod ilk

i var:

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); 
} 

ve:

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>(); 
    } 

ve benim bağlam:

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

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

sen EFRepository görebileceğiniz gibi birini alır tek Oluşturucu sahip argüman - Bu bağlam ve p bir örneğini oluşturmak için Basit Enjektör kullanmak istiyorum çünkü oluşturulduğu sırada depoya koyun.

BLL'de ProductBLL sınıfı var ve bu sınıftaki tüm ürünleri (bazı GetAll yöntemiyle) veritabanından almak ve iletmek istiyorum, bunu HomeController'a söyleyelim.

Bu konuda bana konuşacak birine ihtiyacım var.

Ben Application_Start() fonksiyon I`ve altında nuger (Basit Enjektör ve Basit Enjektör ASP.NET Entegrasyonu) benim global.asax.cs dosyasında da

doğru paketleri yükleyerek başladı ekledi:

var container = new SimpleInjector.Container(); 

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

Ancak, Context örneğini nerede oluşturabilirim? ve iş katmanına nasıl erişebilirim?

cevap

16

muhtemelen (vb Ürün, Müşteri, Çalışan, için) birçok IReposotory<T> uygulamaları sahip olduğundan, bu gibi IRepository<T> için tek bir açık jenerik kayıt yapmak iyidir: kapsamlı yaşam tarzı olarak tanımlanır

container.Register(typeof(IRepository<>), typeof(EFRepository<>), Lifestyle.Scoped); 

:

container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

Bu kaydı Basit Enjektör bir EFRepository<Product> bir IRepository<Product> her istendiğinde, 012 için EFRepository<Customer> dönecektir sağlar, vb., Vb.

aynı DbContext örneği aynı istek içinde tüm depolarda üzerinde kullanılacak istediğimiz için, ayrıca kapsamlı Lifestyle ile DbContext kayıt olmalıdır: i sınıf ProductBLL var BLL yılında

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

ve ben tüm ürünler veritabanından almak ve bunu geçmek istiyorum, bu ProductBLL lik görünüyor HomeController Bu senaryoda

diyelim e bana işe yaramaz bir soyutlama. Tüm bu veriler geçiyorsa, HomeController ürününüzün doğrudan IRepository<Product>'a bağımlı olmasını sağlayabilirsiniz.

+0

Teşekkürler, ancak BLL'de mantıksal bir sınıfım varsa, depoyu nasıl kullanabilirim?Benim konseptim, BLL'in DAL'ye depolar ve MVC görüşmeleri aracılığıyla BLL ile productBLL gibi sınıflar aracılığıyla konuşmasıdır. Ayrıca bu depoya HomeController'da erişmek istersem bunu nasıl yapabilirim? ve EF veritabanını oluşturacak mı? – jony89

+1

BLL sınıfına sahip olmak, yalnızca herhangi bir mantığınız olduğunda kullanışlıdır. Fakat mantığınız varsa, elbette ProductBLL'i ürününüz yerine kontrolörünüze enjekte etmeniz gerekecektir (ya da eklenmiş davranışlar sadece günlüğe kaydetme, güvenlik, doğrulama, vb. Gibi konuları ilgilendiriyorsa) bunun yerine bir yatıştırıcıdır). Eğer kontrol ünitesindeki repo'ya erişmek istiyorsanız, kontrol cihazına birİsoepository enjekte edersiniz; bununla ilgili hiçbir şey yok. Bu sadece çalışır. Gördüğünüz gibi – Steven

+0

Bu konuda oldukça yeni biriyim. Bir kontrolöre 'u nasıl "enjekte edebilirim?" Hangi kod "enjekte" kelimesiyle ilişkili? 'productBLL' içindeki Repostiroy'a nasıl erişebilir ve denetleyiciye nasıl enjekte edebilirim - Lütfen bana bununla ilgili bazı kodları göster. Buna ek olarak hala bir "PASContext" örneğinin "EFRepository" yapıcısına geçtiğini ve veritabanı oluşturulacağını göremiyorum. Bu kod ilk program olduğu gibi. – jony89