工厂方法中的DI

时间:2020-04-24 14:06:01

标签: .net .net-core dependency-injection

我正在为我拥有的一个小项目模拟一个快速流程,并且正在尝试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();

0 个答案:

没有答案