C# 为什么OWIN中间件没有实现为某种接口或抽象类?

C# 为什么OWIN中间件没有实现为某种接口或抽象类?,c#,owin,C#,Owin,我不明白为什么方法IAppBuilder中的第一个参数使用(对象中间件,params object[]args)不需要实现某些接口,而是简单的对象我期待这样的事情 public interface IMiddleWare { public void Invoke(IOwinContext context) } 及 最终,这个中间件必须在某个时刻执行,所以如果它只是对象,那么可以调用什么以及如何调用呢 另外,如果中间件是某个接口,那么下面的代码就不可能了 public class Som

我不明白为什么方法
IAppBuilder中的第一个参数使用(对象中间件,params object[]args)IAppBuilder
接口的code>不需要实现某些接口,而是简单的对象
我期待这样的事情

public interface IMiddleWare
{
    public void Invoke(IOwinContext context)
}

最终,这个中间件必须在某个时刻执行,所以如果它只是对象,那么可以调用什么以及如何调用呢
另外,如果中间件是某个接口,那么下面的代码就不可能了

public class SomeStupidMiddleWare
{
    public void SomeMethod1()
    {
        Console.WriteLine("method1");
    }

    public void SomeMethod2()
    {
        Console.WriteLine("method2");
    }
}

class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use(new SomeStupidMiddleWare());
    }
}
但现在,此代码已成功编译,但生成运行时错误
,类型“OwinEducation.SomeStupidMiddleWare”与任何已知的中间件模式都不匹配




OwinMiddleware类由Microsoft提供,用于通过OWIN服务器(Katana)的实现轻松实现自定义中间件,但OWIN并不是仅限Microsoft使用的技术。通过将中间件用作对象,Katana可以使用非Katana中间件,而非继承自OwinMiddleware的中间件

更详细地讨论中间件签名和实现。最重要的一点是,唯一的要求是有一个签名匹配

Func<IDictionary<string, object>, Task

Func看来我找到了答案。如上所述,Katana支持4种不同的基于约定的模式来添加中间件

  • 委托模式
  • 实例模式
  • 生成器/嵌套委托模式
  • 构造函数类型或类型模式
  • 代表模式 委托模式接受以下委托作为IAppBuilder的Use方法的第一个参数以及任何类型的任意数量的附加参数

    Func<AppFunc, AppFunc>
    
    构造函数类型/类型模式 可以使用此模式将具有以下构造函数和方法的类型添加到中间件中

    public Ctor(AppFunc next, params object[] args);
    public Task Invoke(IDictionary<string, object> env);
    
    public-Ctor(AppFunc-next,params-object[]args);
    公共任务调用(IDictionary env);
    

    因此,IMHO,考虑到这些情况没有任何共同之处,这就是为什么中间件是
    Use
    方法中的
    对象
    ,我们不能为所有这些方法创建一些通用接口

    这篇博文讨论了中间件签名
    我关心的正是这一点。到处都写着中间件必须有一些特定的签名,但是
    IAppBuilder。出于某种原因使用
    可以接受简单的
    对象
    !据我所知,在
    IAppBuilder
    中,它是为所需类型铸造的。但是这很可笑,StackOverflow建议我避免像“谢谢”这样的评论,但我真的很感谢你对我的问题的关注:)特别是有人觉得它不干净如果你觉得答案有用,你可以接受它作为问题的答案。
    public void Initialize(AppFunc next, params object[] args);
    public Task Invoke(IDictionary<string, object> environment);
    
    public AppFunc Invoke(AppFunc next, params object[] args);
    
    public Ctor(AppFunc next, params object[] args);
    public Task Invoke(IDictionary<string, object> env);