1

次のインターフェースがあります。

public interface IRequest
{
}

public interface IResponse
{
}

public interface IRequestHandler<in TRequest, out TResponse>
    where TRequest : IRequest
    where TResponse : IResponse
{        
    TResponse Execute(TRequest request);
}

public interface IRequestHandler<in TRequest> where TRequest : IRequest
{        
    void Execute(TRequest request);
}

次に、具体的な IRequestHandler または IRequestHandler オブジェクトで使用される IRequest および IResponse の具体的な実装を作成します。

具体例は次のとおりです。

 public class GetEngineOptionsRequestHandler : IRequestHandler<GetEngineOptionsRequest,GetEngineOptionsResult> 
{
}

現在、コンストラクター注入を介して、具体的なリクエストとハンドラーを必要なクラスに注入します。

private readonly GetEngineOptionsRequest _engineOptionsRequest;
private readonly GetEngineOptionsRequestHandler _engineOptionsRequestHandler;

public OptionsParser(GetEngineOptionsRequest engineOptionsRequest, GetEngineOptionsRequestHandler engineOptionsRequestHandler)
    {            
        _engineOptionsRequest = engineOptionsRequest;
        _engineOptionsRequestHandler = engineOptionsRequestHandler;           
    }

しかし、その場で RequestHandlers を生成できるようにする必要がある場所があることがわかりました。私の調査では、サービス ロケーターのアンチパターンを回避するための正しい方法は、IFactory/Factory を使用してこれらの ServiceHandlers をオンザフライで作成することです。Ninject、特に Ninject.Extensions.Factory 拡張を使用してそれを行う方法がわかりません。

ユースケースは、単純なファクトリ(私が行ったもの)の場合、次のことができることを示しています。

public interface IFooFactory
{
    Foo CreateFoo();
}

次に、ブートストラップで次のようにバインドします。

kernel.Bind<IFooFactory>().ToFactory();

IFooFactory をコンストラクターに挿入し、それを使用して Foo のインスタンスを作成します。

私の場合、具体的なオブジェクトを生成できるファクトリを作成できる必要があります。

IServiceRequest<IRequest> and IServiceRequest<IRequest,IResponse>.

これを行う方法と、事後にバインドする方法がわかりません。

4

1 に答える 1