2016-04-16 1 views
1

私はAutofacを初めて使い、ネストされたオープンジェネリックサービスタイプの解決にいくつかの問題があります。ネストされたオープンジェネリックのオートファック

ContactServiceに2つのインターフェイスを実装したいと思います。両方のインターフェイスは、同じジェネリック型パラメータを使用することが、2番目は、ネストされている:私がすれば

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

が、これは:次に、(例えば)サービスIFeatureProvider<ContactFeature<Household>>を解決しようと

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

にAutofacを引き起こし

ContactService<ContactFeature<Household>> 

代わりの

をインスタンス化しようとする試み

私は上記がうまくいかない理由を理解しています。それでは私の代わりにこれを試してみました:

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) 

それはAutofacがContactFeature<Household>TParentだけではなくHouseholdとを渡そうとしているように見えます:

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

しかし、私はまだ同様のエラーを取得します。

長い説明は申し訳ありません。私は誰かが私にこれを働かせるのを助けることを願っています

ありがとうございます。

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(); 

どちらも解決さはあなたにContactService<Household>のインスタンスを与えるだろう:

答えて

1

それはあなたがしなければならないすべてのようだが、あなたがそのように、2件の別々の登録に汎用的な登録を開く分割することです。しかし、正直言って、私はなぜそれが別々に働くのか分かりませんし、あなたはそれをひとつの登録でまとめるとうまくいかないのです。

私は解決策をテストするには、次のクラスとインターフェイスを使用:

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

は、私はそれがとても簡単であることを期待していなかった...ありがとうございました!これがAutofacのジェネリック型チェックのバグかもしれないと思いますか? – AndrewC

関連する問題