2016-11-09 3 views
2

Ich habe die interafes und Klassen, die oben in meinem Projekt:Wie registrieren Typen Parameter Konstruktor unterschiedlichen [Unity IoC]

public interface IRepositoryBase<T> : IDisposable where T : class { } 
public interface IUserRepository : IRepositoryBase<User> { } 
public interface IPaymentRepository : IRepositoryBase<Payment> { } 
public class SecurityContext : DbContext { } 
public class FinanceContext : DbContext { } 

public class RepositoryBase<T> : IRepositoryBase<T> where T : class 
{ 
    public RepositoryBase(DbContext context) { } 
} 

Ich versuche, die richtige DbContext auf die Objekte aus dem IUserRepository e erstellt zu injizieren IPaymentRepository Schnittstellen:

  • IUserRepository -> sollten als neue RepositoryBase (neu Security()) gelöst werden
  • IPaymentRepository -> als neu gelöst werden sollte RepositoryBase (neu FinanceContext())

ich den Code unten ohne Erfolg versucht:

container.RegisterType<IUserRepository, RepositoryBase<User>>(
    new InjectionConstructor(container.Resolve<SecurityContext>())); 

... und bekam den folgenden Fehler

Der Typ 'RepositoryBase' kann nicht sein, verwendet als Typ Parameter 'TTo' im generischen Typ oder Methode 'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType (Microsoft.Practices.Unity.IUnityContainer, Params Microsoft.P ractices.Unity.InjectionMember []) '. Es gibt keine implizite Referenzkonvertierung von 'RepositoryBase' zu 'IUserRepository'.

[EDIT] änderte ich den Ansatz, wie Georg vorgeschlagen und es funktioniert super.

beseitigen Nachdem die IUserRepository und IPaymentRepository Schnittstellen ich die Art, wie folgend registriert:

container.RegisterType<IRepositoryBase<User>, RepositoryBase<User>> 
     (new InjectionConstructor(typeof(SecurityContext))); 

Schließlich hatte ich gerade meinen Dienst zu ändern, ein IRepositoryBase injiziert in seinem Konstruktor zu empfangen.

public class UserService : IUserService 
{ 
    private readonly IRepositoryBase<User> _repository; 

    public ColaboradorService(IRepositoryBase<User> repository) 
    { 
     _repository = repository; 
    } 
} 
+0

Klingt wie eine Kovarianz/Kontravarianz Problem, versuchen Sie Folgendes: http://tomasp.net/blog/varicance-explained.aspx/ – Charleh

Antwort

1

Die Fehlermeldung ist korrekt. Ihre Implementierungsklasse RepsoitoryBase<T> implementiert nicht IUserRepository, sondern nur ihren Vorgänger IRepositoryBase<User>, auch wenn der erstere nichts zu letzterem hinzufügt, könnte er diese Funktionalität bieten. Das Erstellen dieser Schnittstelle IUserRepository ist viel mehr als nur ein Alias ​​zu IRepositoryBase<User> und seit .NET keine Eingabe erlaubt, erhalten Sie diese Fehlermeldung.

Sie könnten einfach die Instanz als IRepositoryBase<User> anstelle von IUserRepository registrieren. Da .NET starke Generika hat, ist Ersteres etwas völlig anderes als zum Beispiel IRepositoryBase<Payment>, da die Laufzeit generische Typargumente kennt.

+0

Georg, danke! Ihr Vorschlag löste das Konvertierungsproblem und von diesem Punkt an war es einfach, den richtigen Kontext zu injizieren. Danke. –

Verwandte Themen