2

データベースで特定のクエリを実行し、クライアントブラウザに返すデータのプレゼンテーションモデルを作成するために使用している次のクラスがあります。

public class SpecificFooQuery: IPresentationQuery<FooRequest, FooResult>
{
    public SpecificFooQuery(ILogger logger, DbContext context)
    {
        this.logger = logger;
        this.context = context;
    }

    public FooResult Get(FooRequest request)
    {
        return new FooResult { ... };
    }
}

次の汎用インターフェースを実装します

public interface IPresentationQuery<TRequest, TResult>
    where TRequest : class
    where TResult : class
{
    TResult Get(TRequest request);
}

しかし、オブジェクトを作成するためのインスタンス化を作成するのに問題があります。これは機能しませんが、これ以上のことは今のところありません。

kernel.Bind<IPresentationQuery<FooResult, FooRequest>>().To<SpecificFooQuery>();

誰かがこれを手伝ってくれる?私はどこが間違っているのか、この仕事をするために何をする必要があるのか​​よくわからない。


Error   1   
The type 'SpecificFooQuery' cannot be used as type parameter 
'TImplementation' in the generic type or method   
'Ninject.Syntax.IBindingToSyntax<T1>.To<TImplementation>()'. 
There is no implicit reference conversion from 
'SpecificFooQuery' to 'IPresentationQuery<FooResult,FooRequest>'.   
4

2 に答える 2

3

この質問はNinjectに関するものですが、この種の一般的なトリックを実行している場合は、SimpleInjectorを試してみることをお勧めしますIPresentationQuery<TRequest, TResult>これにより、次のようにすべての実装を1行のコードで登録できます。

container.RegisterManyForOpenGeneric(
    typeof(IPresentationQuery<,>),
    typeof(IPresentationQuery<,>).Assembly);

RegisterManyForOpenGenericは、 SimpleInjector.Extensionsプロジェクトの拡張メソッドであり、 SimpleInjectorと同じようにNuGetからダウンロードできます。

そして、これらすべての実装を汎用デコレータでラップすることも、ワンライナーになります。

container.RegisterDecorator(
    typeof(IPresentationQuery<,>),
    typeof(ValidationPresentationQueryDecorator<,>));

Simple Injectorの優れている点は、一般的なデコレータを扱う場合でも、非常に高速であるということです。また、Simple Injectorは、ジェネリック型の制約も尊重します。デコレータにジェネリック型制約を追加して、特定の型にラップされないようにします。それが不可能な場合は、次のような条件付きデコレータを登録することもできます。

container.RegisterDecorator(
    typeof(IPresentationQuery<,>),
    typeof(ValidationPresentationQueryDecorator<,>),
    context => NeedsValidation(context.ImplementationType));

この登録でさえ最適化されており、提供された述語は閉じたジェネリック型ごとに1回だけ呼び出されます。RegisterDecoratorメソッドは、そのままの拡張プロジェクトの一部ですRegisterManyForOpenGeneric

于 2012-11-26T16:46:16.963 に答える
1

タイプパラメータの順序が間違っているようです。IPresentationQuery<FooResult, FooRequest>の実装にバインドしようとしましたIPresentationQuery<FooRequest, FooResult>

于 2012-11-26T16:05:58.460 に答える