加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中的完全延迟管道

发布时间:2020-12-15 22:32:35 所属栏目:百科 来源:网络整理
导读:我正在设计一个遵循责任链模式的处理程序管道. 管道处理程序具有以下接口: public interface IPipelineHandlerTContext{ FuncTContext,Task Next { get; set; } Task HandleAsync(TContext context);} 每个处理程序都引用了管道中的下一个处理程序.以下类用
我正在设计一个遵循责任链模式的处理程序管道.

管道处理程序具有以下接口:

public interface IPipelineHandler<TContext>
{
    Func<TContext,Task> Next { get; set; }
    Task HandleAsync(TContext context);
}

每个处理程序都引用了管道中的下一个处理程序.以下类用于构建管道:

public class PipelineBuilder<TContext>
{
    private readonly List<IPipelineHandler<TContext>> handlers
        = new List<IPipelineHandler<TContext>>();

    public PipelineBuilder<TContext> Register(IPipelineHandler<TContext> handler)
    {
        handlers.Add(handler);
        return this;
    }

    public Func<TContext,Task> Build()
    {
        IPipelineHandler<TContext> root = null;
        IPipelineHandler<TContext> prev = null;

        foreach (var handler in handlers)
        {
            if (root == null)
            {
                root = handler;
            }
            else
            {
                prev.Next = ctx => handler.HandleAsync(ctx);
            }

            prev = handler;
        }

        return root.HandleAsync;
    }
}

当前实现的缺点是管道中的每个处理程序都是预先构建的.我想按需构造每个处理程序,而不是将处理程序实例传递给构建,而是传递一个Func< IPipelineHandler< TContext>>.

我需要对Build()进行哪些修改才能使用Func< IPipelineHandler< TContext>>这样每个管道处理程序只在调用时创建?

如果不清楚 – 每个处理程序只应在管道中的前一个处理程序调用时创建,而不是在Build()方法期间创建.

解决方法

最终解决方案非常简单.我创建了一个LazyPipelineHandler包装器,这样我仍然可以构建管道但不实例化包装的处理程序,直到它实际需要执行:

public class LazyPipelineHandler<TContext> : PipelineHandler<TContext>
{
    private readonly Lazy<IPipelineHandler<TContext>> innerHandler;

    public LazyPipelineHandler(Func<IPipelineHandler<TContext>> handlerFactory) 
    {
        this.innerHandler = new Lazy<IPipelineHandler<TContext>>(handlerFactory);
    }

    public override Task HandleAsync(TContext context,Func<TContext,Task> next) 
    {
        innerHandler.Value.Next = next;
        return innerHandler.Value.HandleAsync(context);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读