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