我无法弄清楚为什么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
答案 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种不同的基于约定的模式来添加中间件
委托模式 委托模式接受以下委托作为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
,我们无法为所有这些创建一些通用接口