2016-04-16 18 views
1

Ich bin neu in Autofac und einige Probleme mit der Auflösung eines verschachtelten offenen generischen Service-Typs.Autofac mit verschachtelten Open Generics

Ich möchte meine ContactService zwei Schnittstellen implementieren. Beide Schnittstellen nutzen die gleichen generischen Typparameter, aber die zweite ist verschachtelte:

class ContactService<TParent> 
    : IContactService<TParent>, 
     IFeatureProvider<ContactFeature<TParent>> 
    where TParent : class, IDomainModel 
{ } 

Wenn ich dies tun:

builder 
    .RegisterGeneric(typeof(ContactService<>)) 
    .As(typeof(IContactService<>)) 
    .As(typeof(IFeatureProvider<>); 

Dann versucht, den Dienst IFeatureProvider<ContactFeature<Household>> (zum Beispiel) zu lösen verursacht Autofac zu versuchen

ContactService<ContactFeature<Household>> 

statt

zu instanziiert

Ich verstehe, warum das oben genannte nicht funktioniert. Also habe ich versucht, diese stattdessen:

builder 
    .RegisterGeneric(typeof(ContactService<>)) 
    .As(typeof(IContactService<>)) 
    .As(typeof(IFeatureProvider<>) 
     .MakeGenericType(typeof(ContactFeature<>))); 

Allerdings habe ich immer noch eine ähnliche Fehlermeldung erhalten:

TypeLoadException: GenericArguments[0], 'ContactFeature`1[Household]', 
    on 'Contact`1[TParent]' violates the constraint of type parameter 'TParent'. 

System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, 
    Int32 numGenericArgs, ObjectHandleOnStack type) 

ArgumentException: GenericArguments[0], 'ContactFeature`1[Household]', 
    on 'IContactService`1[TParent]' violates the constraint of type 'TParent'. 

System.RuntimeType.ValidateGenericArguments(MemberInfo definition, 
    RuntimeType[] genericArguments, Exception e) 

Es sieht aus wie Autofac ContactFeature<Household> als TParent statt nur Household zu passieren versucht.

Entschuldigung für die lange Erklärung. Ich hoffe, dass jemand mir helfen kann, dies zur Arbeit zu bringen!

Vielen Dank.

Antwort

1

Es scheint, alles, was Sie tun müssen, ist, dass Sie generische Anmeldung zu 2 separate Anmeldungen öffnen zu spalten, wie folgt aus:

var builder = new ContainerBuilder(); 
builder.RegisterGeneric(typeof(ContactService<>)) 
    .As(typeof(IContactService<>)); 

builder.RegisterGeneric(typeof(ContactService<>)) 
    .As(typeof(IFeatureProvider<>)); 

var container = builder.Build(); 

var service = container.Resolve(typeof(IFeatureProvider<ContactFeature<Household>>)); 
var service2 = container.Resolve(typeof(IContactService<Household>)); 

Console.WriteLine(service.GetType()); 
Console.WriteLine(service2.GetType()); 

Console.ReadKey(); 

Beide Entschlüssen Sie Instanzen von ContactService<Household> geben würde. Aber um ehrlich zu sein, ich weiß nicht, warum es separat funktioniert und nicht funktioniert, wenn Sie es in einer einzigen Registrierung zusammenstellen.

ich verwenden, um die folgenden Klassen und Schnittstellen, um die Lösung zu testen:

class ContactService<TParent> : IContactService<TParent>, IFeatureProvider<ContactFeature<TParent>> 
    where TParent : class, IDomainModel 
{ 
} 

interface IContactService<T> where T : class, IDomainModel 
{ 
} 

interface IFeatureProvider<TProvider> 
{ 
} 

interface IDomainModel 
{ 
} 

class Household : IDomainModel 
{ 
} 

class ContactFeature<TDomainModel> where TDomainModel: class, IDomainModel 
{ 
} 
+0

Thank you very much ... Ich war nicht erwartet, dass es so einfach zu sein! Glauben Sie, dass dies ein Fehler in der generischen Typprüfung von Autofac sein könnte? – AndrewC