2016-04-26 4 views
1

Ich habe eine generische Schnittstelle wie folgt definiert:TornLifestyle einfachen Injektor

public class ProviderPlanManagementRepo : IPlanManagmentRepository<Provider> 

alles funktioniert durch die Registrierung der Schnittstelle wie folgt aus::

public interface IPlanManagmentRepository<TEntity> where TEntity:class 

Wenn ich eine konkrete Umsetzung wie folgt definieren

container.Register(typeof(IPlanManagmentRepository<>), 
    new [] { typeof(IPlanManagmentRepository<>).Assembly}, 
    Lifestyle.Scoped); 

Allerdings, wenn diese Klasse a lso Griffe mehr Sachen und ich füge eine zusätzliche Schnittstelle:

public interface IProviderPlanManagementRepo 
{ 
    void doSomethingSpecificToProviderHere(); 
} 
public class ProviderPlanManagementRepo : IProviderPlanManagementRepo, 
    IPlanManagmentRepository<Provider> 
{ 
} 

Dann bekomme ich diesen Fehler:

-[Torn Lifestyle] The registration for IPlanManagmentRepository maps to the same implementation and lifestyle as the registration for IProviderPlanManagementRepo does. They both map to ProviderPlanManagementRepo

Ich habe auch versucht IPlanManagmentRepository in IProviderPlanManagementRepo zu erben, aber den gleichen Fehler bekam.

Sollte diese Klasse nur die Implementierung von der generischen Schnittstelle behandeln? oder ist es möglich, dies mit einem einfachen Injektor zu erreichen?

Antwort

3

Ihre Frage bezieht sich auf diese work item und this discussion. In der Regel können zerrissene Lebensstile behoben werden as follows, aber Simple Injector 3.1 macht es außerordentlich schwierig, Verletzungen zu beheben, wenn Typen mit mehreren nicht verwandten Schnittstellen mit Batch-Registrierung registriert werden. Dies werden wir in einer der kommenden Minor Releases behandeln.

Die einfachste Lösung, die ich Ihnen empfehlen kann, ist, Ihre IPlanManagmentRepository<T> Registrierungen vorübergehend zu machen. Sie sollten in der Lage sein, sie vorübergehend zu machen, weil Ihre Komponenten auf irgendeine Weise unveränderlich sein sollten. In der Regel sollte also nur die DbContextScoped sein, aber Sie möchten möglicherweise nicht die DbContext in Ihre Repositories injizieren, da die DbContext Laufzeitdaten und die Laufzeitdaten not be injected into the components of your object graph sind.

+0

Dank @Steven, wie du erwähnt mein DbContext ist Bereich, ich versuchte Ihren Vorschlag und es funktioniert, auch wenn DbContext Bereich ist, aber ich frage mich, ob dies einige potenzielle Probleme haben kann, wenn ich 3 Repositories einschließlich der genannten verwenden oben (der, der vorübergehend ist), werden alle 3 den gleichen DbContext teilen? Dies ist wichtig, da sie alle die gleiche Transaktion teilen müssen. –

+0

@ danif430: Ja, sie werden die gleiche Instanz teilen. Versuch es. – Steven