3 Stimmen

Autofac: Verwendung der Konstruktionsinjektion bei Klassen mit Abhängigkeit von einem anderen Objekt Funktionsausgabe

Diese Frage bezieht sich auf IoC im Allgemeinen, aber ich verwende Autofac, also wäre eine Autofac-Lösung großartig.

Nehmen Sie also die folgenden Klassen an:

class A
{
    IEnumerable<B> GetBs();
}

class B 
{
    // Some code
}

class C
{
    readonly IEnumerable<B> bs;

    C(IEnumerable<B> bs)
    {
        this.bs = bs;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.Register<A>();
        builder.Register<C>();

        var container = builder.Build();
        var c = container.Resolve<C>();
        // do something with c
    }
}

die oben genannten Main wird scheitern.

Ich habe festgestellt, dass ich dieses Problem durch Hinzufügen dieser Codezeile lösen kann:

builder.Register(c => c.Resolve<A>().GetBs())

Das fühlt sich aber nicht richtig an. Gibt es eine andere Möglichkeit, dies zu erreichen? Oder Änderungen am Design?

3voto

Mark Seemann Punkte 216836

So wie es aussieht, ist diese Klassenstruktur völlig in Ordnung. Sie verwenden ordnungsgemäß Constructor Injection und nutzen die statische Struktur der Klassen zur Kommunikation Invarianten und Beziehungen . Auf der Ebene der hier zur Verfügung gestellten Informationen, denke ich, das einzige, was fehlt, ist eine Guard Clause im C-Konstruktor :)

Auf einer konzeptionellen Ebene ist es schwieriger zu beantworten, ob dies ein guter Entwurf ist oder nicht. Das hängt vom Kontext ab, der hier nicht gegeben ist. Ist B ein Dienst oder ein Entität ? Was ist die beabsichtigt Quelle von Bs?

Als Faustregel sollten wir nur Dienste injizieren, aber Entitäten mit Diensten behandeln (wie Repositories oder Gateways oder was auch immer), wenn also B einen Dienst repräsentiert, wäre es in Ordnung, ihn in C zu injizieren. Wenn er eine Entität repräsentiert, wird er verdächtig - es sei denn, C ist auch eine Entität...

Außerdem können Sie sich über die kanonische Quelle von Bs. Wenn A wirklich der Container von Bs sein soll, dann ist die obige Lösung korrekt (und idiomatischer Autofac-Code). Wenn die Bs wirklich einen anderen Ursprung haben, könnte die Auflösung durch A ein Hack sein...

0voto

Rich Tebb Punkte 6311

Angesichts Ihrer Antwort auf die akzeptierte Antwort gibt es vielleicht eine andere Technik, die in Autofac verwendet werden kann. Wenn der Satz von Plugins während der Registrierung verfügbar ist, könnten Sie sie als Sammlung zu registrieren .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X