Wie zu verwenden eine Einfache Injektor -, Repository-und Kontext - erste code
Ich versuche, Einfache Injektor zu schaffen, mein repository und verwenden Sie es in der Business-Logik-Schicht ( auch ich will PerWebRequest-Methode ) .
In der DAL Schicht ich habe :
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);
}
und :
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>();
}
und mein Kontext :
public class PASContext : DbContext, IDbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<User> Users { get; set; }
public PASContext()
: base("PostAndSell")
{ }
}
Wie Sie sehen können EFRepository
hat nur einen Konstruktor, der ein argument - das ist, da will ich mit Einfach Injektor zum erstellen einer Instanz des Kontexts und der übergabe an das repository, während es erstellt wird .
In der BLL habe ich eine Klasse ProductBLL
und ich möchte, um alle Produkte in dieser Klasse (mit einigen GetAll-Methode) aus der Datenbank und übergeben Sie es, sagen zu HomeController .
Ich brauche wirklich jemanden zum reden mich durch diese .
Begann ich, durch die Installation der richtigen Pakete aus dem nuger (Einfach Injektor und Einfache Injektor ASP.NET Integration)
auch in meiner global.asax.cs-Datei, unter Application_Start()
Funktion die ich Hinzugefügt habe :
var container = new SimpleInjector.Container();
container.RegisterPerWebRequest<IRepository<Product>, EFRepository<Product>>();
aber wo erstelle ich die Context-Instanz ? und wie kann ich es in der business-Schicht ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie wahrscheinlich haben viele
IReposotory<T>
Implementierungen (für Produkt, Kunde, Mitarbeiter, etc), ist es besser, eine einzige offene generische Registrierung fürIRepository<T>
wie diese:Wo der Gültigkeitsbereich lebensstil ist definiert als:
Diese Registrierung wird sichergestellt, dass Einfache Injektor zurück
EFRepository<Product>
jedes mal, wenn einIRepository<Product>
angefordert wird, eineEFRepository<Customer>
fürIRepository<Customer>
, und so weiter, und so weiter.Da Sie die gleichen
DbContext
Instanz verwendet werden, die über alle repositories innerhalb der gleichen Anfrage, sollten Sie auch für die RegistrierungDbContext
mit dem scoped-Lifestyle:In diesem Szenario, das
ProductBLL
scheint wie eine nutzlose Abstraktion zu mir. Wenn alle es tut, ist die Weitergabe der Daten durch, Sie können so leicht lassen Sie IhreHomeController
abhängenIRepository<Product>
direkt.productBLL
und Spritzen es auf die controller - Bitte zeigen Sie mir einige Codes zu diesem Zusammenhang . Außerdem ich kann immer noch nicht sehen, wo eine Instanz vonPASContext
ist, geht auf denEFRepository
Konstruktor.. und wenn die Datenbank erstellt wird ? als dies ist der code-first-Programm.IEntityRepository<T>
, und (2) business-rich-Transaktionen erfolgt durchSomeService
erwartetFooContext
direkt. Die Dienste und Rahmen haben keine Schnittstellen. SimpleInjector spuckt runtime Fehler in Bezug auf den Kurzschluss Abhängigkeit und die zweideutige Lebensweise, sagenFooContext
ist eine vorübergehende undDbContext
eine web-Anfrage. Warum transient? Verschiedene genug für eine neue Frage?