所以我在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