Dependency injection mit EF DbContext implementiert 2 interfaces

Gegeben DbContext implementiert 2 interfaces etwa so:

public interface IQueryEntities
{
    IQueryable<User> Users { get; }
    IQueryable<Computer> Computers { get; }
    //other IQueryable<T> get properties
}

public interface IUnitOfWork
{
    int SaveChanges();
}

public class MyContext : DbContext, IQueryEntities, IUnitOfWork
{
    //implement interfaces using EF
}

Erste Frage, ist es eine schlechte Idee, sich zu trennen die Abfrage Aspekte der DbContext (IDbSets) aus dem Befehl Aspekte (SaveChanges)? Ich bin erkunden, umgestalten, um die da oben es gibt eine Menge von Fällen, in denen wir müssen nur die Abfrage von Daten, ohne zu speichern, nichts.

Das problem, ich bin mit in die Einheit beinhaltet DI, die derzeit injiziert MyDbContext mit einer singleton-pro-http-Kontext Lebenszeit für die IUnitOfWork-Schnittstelle. Ich bin mir nicht sicher, wie Sie gehen über das einrichten der Injektion für die IQueryEntities-Schnittstelle, so dass es ein vorhandenes DbContext-Instanz, die möglicherweise bereits gespritzt wurden, gegen die IUnitOfWork-Schnittstelle. Oder Umgekehrt. Ist das überhaupt möglich?

Hier ist die aktuelle Lebenszeit-manager, verwendet, die zuvor injiziert Instanzen von IUnitOfWork in der gleichen http-Kontext:

public class UnityHttpContextLifetimeManager : LifetimeManager
{
    private const string KeyFormat = "SingletonPerCallContext_{0}";
    private readonly string _key;

    public UnityHttpContextLifetimeManager()
    {
        _key = string.Format(KeyFormat, Guid.NewGuid());
    }

    public override object GetValue()
    {
        return HttpContext.Current.Items[_key];
    }

    public override void SetValue(object newValue)
    {
        HttpContext.Current.Items[_key] = newValue;
    }

    public override void RemoveValue()
    {
        HttpContext.Current.Items.Remove(_key);
    }
}

Übrigens, wenn es einen Weg gibt, dies zu tun, ich würde lieber tun Sie es in unity web.config-Abschnitt eher als kompiliertes c# - bootstrapper.

Update

Mit Hilfe von on-ich war in der Lage, diese arbeiten, wie auch immer, meine config sieht anders aus als das, was er vorgeschlagen hat. Mache ich etwas falsch? Wenn ich nicht jede Schnittstelle die Lebensdauer manager, die eine HttpContext endet mit mehreren Instanzen des DbContext. Nur wenn ich alle 3 die lifetime manager wird es die Wiederverwendung der gleichen DbContext-Instanz über eine einzige Anfrage für die beiden Schnittstellen. Ist etwas falsch mit dieser config?

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <namespace name="MyApp.MyNameSpace" />
    <assembly name="MyApp" />
    <alias alias="singleton-per-http-context" 
        type="MyApp.MyNameSpace.UnityHttpContextLifetimeManager, MyApp" />
    <container>
        <register type="MyContext">
            <lifetime type="singleton-per-http-context" />
        </register>
        <register type="IUnitOfWork" mapTo="MyContext">
            <lifetime type="singleton-per-http-context" />
        </register>
        <register type="IQueryEntities" mapTo="MyContext">
            <lifetime type="singleton-per-http-context" />
        </register>
        ...
    </container>
InformationsquelleAutor danludwig | 2012-01-30
Schreibe einen Kommentar