我有以下接口:
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);
}
然后,我有 IRequest 和 IResponse 的具体实现,它们都在具体的 IRequestHandler 或 IRequestHandler 对象中使用。
一个具体的例子是:
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 动态创建这些 ServiceHandler。我只是不确定如何使用 Ninject 来做到这一点,尤其是 Ninject.Extensions.Factory 扩展。
用例表明,对于一个简单的工厂(我已经做过),您可以这样做:
public interface IFooFactory
{
Foo CreateFoo();
}
然后将其绑定到您的引导程序中:
kernel.Bind<IFooFactory>().ToFactory();
并将 IFooFactory 注入您的构造函数并使用它创建 Foo 的实例。
就我而言,我需要能够创建一个能够从以下位置生成具体对象的工厂:
IServiceRequest<IRequest> and IServiceRequest<IRequest,IResponse>.
我不确定如何做到这一点,以及事后如何绑定它。