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

Why OWIN middleware is not implemented as some interface or abstraction class?

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

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

IAppBuilder Use(IMiddleware middleware, params object[] args);

最终这个中间件必须在某个时候执行,那么如果它只是对象,可以调用什么以及如何调用??!!
此外,如果中间件是某种接口,则以下代码将无法实现

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());
    }
}

但是现在这段代码编译成功但是产生运行时错误The type 'OwinEducation.SomeStupidMiddleWare' does not match any known middleware pattern

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

This blog post 更详细地讨论了中间件签名和实现。最重要的信息是唯一的要求是签名匹配

Func<IDictionary<string, object>, Task

您还可以查看 OWIN site, and specifically the section on Application Delegates

看来我找到了答案。正如所指出的 here Katana 支持 4 种不同的基于约定的模式来添加中间件

  1. 委托模式
  2. 实例模式
  3. Generator/Nested 委托模式
  4. 构造函数类型或类型模式

委托模式 委托模式接受以下委托作为 IAppBuilder 的 Use 方法的第一个参数和任意数量的任意类型的附加参数

Func<AppFunc, AppFunc>

实例模式 要使用此模式添加中间件,我们需要具有以下两种方法的新类型

public void Initialize(AppFunc next, params object[] args);
public Task Invoke(IDictionary<string, object> environment);

Generator/Nested 委托模式 要使用此模式创建中间件,我们需要一个具有以下方法的新类型

public AppFunc Invoke(AppFunc next, params object[] args);

构造函数类型/类型模式 可以使用此模式将具有以下构造函数和方法的类型添加为中间件

public Ctor(AppFunc next, params object[] args);
public Task Invoke(IDictionary<string, object> env);

所以,恕我直言,考虑到这些情况没有任何共同点,这就是为什么中间件在 Use 方法中是 object 并且我们无法为所有这些情况创建一些通用接口