所以我在C#下面的代码:C#函数使用扩展函数,但VB等效不?
public Container ConfigureSimpleInjector(IAppBuilder app)
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
container.RegisterPackages();
app.Use(async (context, next) =>
{
using (AsyncScopedLifestyle.BeginScope(container))
{
await next();
}
});
container.Verify();
return container;
}
的app.Use()
被定义为Owin.AppBuilderUserExtensions.Use()
,看起来像这样:
public static IAppBuilder Use(this IAppBuilder app, Func<IOwinContext, Func<Task>, Task> handler);
VB的等效如下:
Public Function ConfigureSimpleInjector(app As IAppBuilder) As Container
Dim container = New Container()
container.Options.DefaultScopedLifestyle = New AsyncScopedLifestyle()
container.RegisterPackages()
app.Use(Async Sub(context, [next])
Using AsyncScopedLifestyle.BeginScope(container)
Await [next]()
End Using
End Sub)
container.Verify()
Return container
End Function
出于某种原因,在VB版本中,app.Use()
不使用扩展功能可用,并且简单地使用IAppBuilder.Use()
代替,如下:
Function Use(middleware As Object, ParamArray args() As Object) As IAppBuilder
为什么VB代码不使用C#做同样的扩展功能,我怎样才能使它使用?
编辑
为了清楚起见,扩展方法不是我自己的。他们来自欧文第三方图书馆。所以没有重命名扩展方法的选项。
如果你在app.Use(Async ...)中使用'Func'而不是'Sub',它会有所作为吗?该方法的签名与框架中的不匹配 – pasty
我不相信,因为据我所知,它不应该返回一个值。我的意思是使用'Function'而不是抛出一个错误,因为那么它的希望得到一个返回值 –
IMO它应该为了使用一个重写方法,签名必须匹配,看一下[定义](https://msdn.microsoft.com/en-us/library/owin。 appbuilderuseextensions.use(v = vs.113).aspx?cs-save-lang = 1&cs-lang = vb#code-snippet-1)。如果没有,编译器应该如何知道,你想调用这个方法?目前来说吧看作一个参数(因此使用第一个方法定义)。你现在(你可以验证)在C#版本中,它使用Func参数调用方法? – pasty