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

时间:2015-07-22 12:55:47

标签: c# owin

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

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

2 个答案:

答案 0 :(得分:3)

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

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

Func<IDictionary<string, object>, Task

您还可以查看OWIN site,特别是Application Delegates

部分

答案 1 :(得分:1)

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

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

    Func<AppFunc, AppFunc>
    

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

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

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