我正在为我拥有的一个小项目模拟一个快速流程,并且正在尝试DI某些对象。
我将在这里解释主流:我有一些需要运行的命令,例如“ GetPlaylist”和“ ClearPlaylist”,这些命令很容易理解。我试图通过创建此ApiProcess类使它尽可能地可重用-这涉及使进程处理请求。
public class ApiProcess : IAPIProcess
{
private IProcessFactory processFactory;
public ApiProcess(IProcessFactory processFactory)
{
this.processFactory = processFactory;
}
public IResponseMessage RunCommand<T>(IRequest request)
{
//Process is returned based on request.RequestType. E.G GET_PLAYLIST
IProcess process = processFactory.GetProcess(request);
IResponseMessage validationResponseMessage = process.Validate(request);
if (validationResponseMessage.StatusCode != Status.FAILURE)
{
return process.Process(request);
}
return validationResponseMessage;
}
}
我遇到的问题是,DI都在项目中,但get流程工厂并不是由于IProcess类在构造函数中具有验证器类,所以我在“ return new GetPlaylistProcess() ;“一行说它期望初始化中有一个IValidator类。所以我的问题是,如何在不预先注册的情况下在运行时获得具体的实现?因此,遵循以下原则:
案例...返回service.getservice()
public class ProcessFactory : IProcessFactory
{
public IProcess GetProcess(IRequest request)
{
switch (request.RequestType)
{
case RequestType.GET_PLAYLIST:
return new GetPlaylistProcess();
case RequestType.CLEAR_PLAYLIST:
break;
}
return null;
}
}
这是一个流程类的例子;
public class GetPlaylistProcess : IProcess
{
private readonly IValidator validator;
public GetPlaylistProcess(IValidator validator)
{
this.validator = validator;
}
public IResponseMessage Validate(IRequest request)
{
IResponseMessage responseMessage = new ReponseMessage();
try
{
validator.AddRule(new NotNullRule());
if (validator.ValidateRequest(request))
responseMessage.StatusCode = Status.SUCCESS;
}
catch (Exception ex)
{
Console.Write(ex);
}
return responseMessage;
}
public IResponseMessage Process(IRequest request)
{
GetPlaylistRequest concreteRequest = request as GetPlaylistRequest;
return null;
}
}
以及我如何注册我的服务
var serviceProvider = new ServiceCollection()
.AddSingleton<IValidator, Validator>()
.AddSingleton<IProcessFactory, ProcessFactory>()
.AddSingleton<IAPIProcess, ApiProcess>()
.BuildServiceProvider();