3

Ich arbeite an einem großen C# Enterprise-Projekt, das erhebliche Architekturprobleme aufweist. Eines dieser Probleme ist, dass es überall statische Referenzen auf einen StructureMap-Container gibt (statischer Service Locator). Als ersten Schritt, um Dinge zu reparieren, übergeben wir den Container an Konstrukteure und entfernen die statischen Containerreferenzen.Entity Framework: Abhängigkeiten in Entitäten einfügen, wenn andere Optionen problematisch sind

Leider gibt es Aufrufe des statischen Containers in Entitäten, die von Entity Framework erstellt wurden. Es ist momentan nicht möglich, all diese Abhängigkeiten auf die Clients dieser Entitäten zu übertragen, da dies häufig geschieht und der Umfang der Änderungen. Unser Ziel ist es, den statischen Container zu entfernen und viele Änderungen vorzunehmen, damit dies vom Management nicht zugelassen wird.

Ich möchte den Container in die Entitäten injizieren, wenn sie von Entity Framework erstellt werden, gibt es eine Möglichkeit, dies zu tun?

Vielen Dank im Voraus :)

+0

Verschieben die Abhängigkeiten aus den Einheiten und Schalt Injektion von Service-Locator sind Teil des Plans des Abhängigkeits aber ein Schritt zu einer Zeit ... – nash

Antwort

3

Ich erinnere mich, den ich vor einigen Jahren irgendwo gelesen, dass Dienstleistungen in Einheiten durch Konstruktor injiziert werden können, aber ich kann es nicht jetzt finden, vielleicht lese ich über IDbDependencyResolver die andere dient Zweck.

Als vorübergehende Lösung würde ich vorschlagen, Entitäten mit Schnittstelle wie IHaveServiceLocator zu markieren und ObjectMaterialized Ereignis zu verwenden.

public interface IHaveServiceLocator 
{ 
    IServiceLocator ServiceLocator { get; set; } 
} 

Und dann der Ort, wo Sie erstellen DbContext Zugang zu Service-Locator haben sollte, so dass Sie es auf Entitäten erstellt festlegen können.

((IObjectContextAdapter)dbContext).ObjectContext.ObjectMaterialized += (s, e) => 
{ 
    var entity = e.Entity as IHaveServiceLocator; 

    if (entity != null) 
    { 
     entity.ServiceLocator = structureMapServiceLocator; 
    } 
} 
+0

Danke, wirkt wie ein Zauber. Es ist schön, nur eine Schnittstelle zu implementieren und den Container injizieren zu lassen. – nash

+0

das sieht vollkommen vernünftig aus; aber es gibt Leute, die "servicelocator, ah! anti-pattern!" schreien würden. Was würdest du ihnen sagen? –

+0

@ jenson-button-event Ich stimme definitiv zu, dass Service Locator anti-pattern ist und persönlich fast nie benutzt wird. Aber manchmal macht es den Job und spart vom Umschreiben der gesamten Codebasis wie es diese Frage ist. –

Verwandte Themen