使用 VB.NET 的构造函数的 Webforms Autofac 参数

大树

所以,我想做我认为应该是这么简单的任务......使用 Autofac 将参数传递给构造函数!

但是,我已经设法解决了工作,但只是不认为这是正确的,我觉得我从 Autofac 指南中更改了太多推荐的代码

我很高兴在 C# 或 VB.net 中得到答案 没关系,代码的位置都是一样的

所以,这是我的设置(我不关心整洁,只是想让它现在工作)

在我的 global.asax 我有:

'***Note, the autofac guide had this a a private shared, see below for why i changed it***
' Provider that holds the application container. 
Public Shared _containerProvider As IContainerProvider

' Instance property that will be used by Autofac HttpModules
' to resolve And inject dependencies.
Public ReadOnly Property ContainerProvider As IContainerProvider Implements IContainerProviderAccessor.ContainerProvider
        Get
            Return _containerProvider
        End Get
End Property

然后在 application_start 中的 global.asax 中,我有:

***again, note, originally I was using IMyClass when registering type... not sure this or that is correct***
Dim builder As New ContainerBuilder()
builder.RegisterType(Of MyClass)().As(Of MyClass)().InstancePerLifetimeScope()

'... continue registering dependencies...
' Once you're done registering things, set the container
' provider up with your registrations.
_containerProvider = New ContainerProvider(builder.Build())

正如你所看到的,最初 _containerProvider 只是公开的,但我不得不让它“共享”才能工作,这马上就感觉不对了!

所以,现在,在我的 webForm1.aspx.vb 中,我有这个:

Public Property MyClass2 As IMyClass
Private _myClass As IMyClass

现在,因为我已将全局调整为“registerType”以使用实际对象,而不是接口(这似乎也必须更改它似乎是错误的),这意味着现在我的 webform 公共属性没有被设置(但是,因为我的解决方法,无论如何我都不需要)

另外,请注意private _myClass......这是我的解决方法,

所以现在在我的 Webform init 方法中,我有以下内容:

WebForm1.aspx.vb*

_myClass = [Global]._containerProvider.RequestLifetime.Resolve(Of MyClass)(New TypedParameter(GetType(HttpRequest), Request))

现在用正确注入的参数实例化我的 _myClass ......这很棒,whoopadeedoo

......但是......我不认为这是正确的。

现在,当我不需要将参数传递给构造函数时,一切都很好,不需要更改 autofac 指南中的任何代码,它就可以工作,在我的 webform.aspx 页面上设置公共属性很好,是非常好。

但是,一旦我开始使用传递给构造函数的参数,似乎一切都需要调整才能正常工作?这样对吗?

我什至尝试过 autofac 的委托指南,但是在我的 webForm.aspx 页面中执行此操作对我来说根本不起作用:

Dim container As ILifetimeScope = [Global]._containerProvider.RequestLifetime
Dim myClassFactory As MyClass = container.Resolve(Of MyClass.Factory)
Dim myClassholding As MyClass = myClassFactory.Invoke("ABC")

甚至在没有“调用”的情况下也尝试过,但是“无法索引,因为它没有默认属性”

以防万一它有帮助,这里是“myClass”

Private _myID as integer
Public Delegate Sub Factory(myID As integer)

Sub New()
End Sub
Sub New(myID As integer)
    _myID = myID
End Sub
Public Sub DoSomething() Implements IDfCookieManager.DoSomething
    'do something with myID
End Sub


我知道我可以将 id 作为参数传递给 DoSomething,但我想了解如何将其传递给构造函数,所以,我的问题:

如果这不是如何做到这一点(我希望它不正确),如何我会在不需要更改所有全局设置的情况下执行此操作吗?

最好使用委托工厂还是只是解决?

我真的需要将全局容器更改为共享/静态,以便我可以从我的代码中访问该容器吗?

大树

所以,有两种方法,但首先,不应该混淆 Autofac 建议如何在 global.asax 中设置 ContainerProvider ......我可以将它保持为非共享(非静态),并访问这个值我做下列的:

   Dim cpa As IContainerProviderAccessor = (CType(HttpContext.Current.ApplicationInstance, IContainerProviderAccessor))
   Dim scope As ILifetimeScope = cpa.ContainerProvider.RequestLifetime

还有,在我们的webform.aspx页面中,我们解析的Public Property MyClass As IMyClass时候需要传入参数给构造函数的时候不应该添加(否则会在我们尝试手动解析之前被解析!

1:使用TypedParameter传入

这是我调整后的代码,用于使用解析(包括上面的行)传入参数:

Dim cpa As IContainerProviderAccessor = (CType(HttpContext.Current.ApplicationInstance, IContainerProviderAccessor))
Dim scope As ILifetimeScope = cpa.ContainerProvider.RequestLifetime
Dim myClass As MyClass = scope.Resolve(Of IMyClass)(New TypedParameter(GetType(Integer), 123))

此外,需要删除 WebForm1.aspx 顶部的公共属性,因为这将自动解析,这意味着,如果我尝试手动“解析”对象,它已经由 autofac 自动解析(这就是为什么我以为我的代码最初不起作用),并且已经使用空构造函数实例化了对象!

2:使用委托工厂

该行不Public Delegate Sub Factory(myID As integer)正确,它应该使用 Autofac 的功能来自动设置!所以应该是:Public Delegate Function Factory(myID As integer) as MyClass

在 Global.asax 中,我只需要添加 this builder.RegisterType(Of MyClass)().InstancePerLifetimeScope(),因为我们需要一个参数并使用工厂,我们不能附加.As(Of IMyClass)

最后,我们的 webform1.aspx.vb 只需要这个:

Dim cpa As IContainerProviderAccessor = (CType(HttpContext.Current.ApplicationInstance, IContainerProviderAccessor))
Dim scope As ILifetimeScope = cpa.ContainerProvider.RequestLifetime
Dim myClassFactory As MyClass.Factory = scope.Resolve(Of MyClass.Factory)
_myClass = myClassFactory.Invoke(123)


然而,我稍微调整了一下:

Dim cpa As IContainerProviderAccessor = (CType(HttpContext.Current.ApplicationInstance, IContainerProviderAccessor))
Dim scope As ILifetimeScope = cpa.ContainerProvider.RequestLifetime
Dim myClass As MyClass = scope.Resolve(Of MyClass.Factory).Invoke(123)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Autofac。使用参数向构造函数注册类

来自分类Dev

使用构造函数的Autofac

来自分类Dev

如何在ASP.NET Webforms中使用Autofac注入NLog

来自分类Dev

构造函数使用参数调用构造函数

来自分类Dev

ASP.net WebForms-构造函数与Page_Load

来自分类Dev

如何使用 vb.net 在 asp net webforms 中显示带有是或否的消息框?

来自分类Dev

具有WebApi的AutoFac,仍在寻找参数较少的构造函数

来自分类Dev

Autofac随机无参数公共构造函数。错误

来自分类Dev

在autofac中间件中检查构造函数参数

来自分类Dev

带有WebApi的AutoFac,仍在寻找参数较少的构造函数

来自分类Dev

使用 memorystream 使用 VB.NET 和 Webforms 进行 pdf 下载

来自分类Dev

使用VB.net更改存储的参数

来自分类Dev

如何对C#和VB.NET WebForms站点使用通用母版页

来自分类Dev

vb.net 自身的类构造函数

来自分类Dev

不带构造函数参数的.NET Core DI

来自分类Dev

如何使用Autofac在构造函数中注入特定的实现

来自分类Dev

在没有构造函数注入的情况下使用AutoFac

来自分类Dev

使用“构造函数范围”注入依赖项-Autofac

来自分类Dev

使用C#和Autofac的构造函数注入模式

来自分类Dev

使用Autofac配置AutoMapper来满足ITypeConverter <,>构造函数依赖

来自分类Dev

在constexpr类的构造函数外部使用构造函数参数

来自分类Dev

使用Ninject的ASP.Net MVC4,HttpPost返回“无参数构造函数”

来自分类Dev

在 WinForms.NET 的 CreateParams 中使用传递给表单构造函数的参数

来自分类Dev

VB.NET中的C#Webforms用户控件

来自分类Dev

使用autofac在.net Core中使用参数(服务)注册上下文

来自分类Dev

将VB函数回调作为参数传递给.NET

来自分类Dev

类类型作为vb.net中的函数参数

来自分类Dev

VB.NET 将函数传递给 Action 参数

来自分类Dev

传递给 VB.NET 中的函数时声明参数

Related 相关文章

  1. 1

    Autofac。使用参数向构造函数注册类

  2. 2

    使用构造函数的Autofac

  3. 3

    如何在ASP.NET Webforms中使用Autofac注入NLog

  4. 4

    构造函数使用参数调用构造函数

  5. 5

    ASP.net WebForms-构造函数与Page_Load

  6. 6

    如何使用 vb.net 在 asp net webforms 中显示带有是或否的消息框?

  7. 7

    具有WebApi的AutoFac,仍在寻找参数较少的构造函数

  8. 8

    Autofac随机无参数公共构造函数。错误

  9. 9

    在autofac中间件中检查构造函数参数

  10. 10

    带有WebApi的AutoFac,仍在寻找参数较少的构造函数

  11. 11

    使用 memorystream 使用 VB.NET 和 Webforms 进行 pdf 下载

  12. 12

    使用VB.net更改存储的参数

  13. 13

    如何对C#和VB.NET WebForms站点使用通用母版页

  14. 14

    vb.net 自身的类构造函数

  15. 15

    不带构造函数参数的.NET Core DI

  16. 16

    如何使用Autofac在构造函数中注入特定的实现

  17. 17

    在没有构造函数注入的情况下使用AutoFac

  18. 18

    使用“构造函数范围”注入依赖项-Autofac

  19. 19

    使用C#和Autofac的构造函数注入模式

  20. 20

    使用Autofac配置AutoMapper来满足ITypeConverter <,>构造函数依赖

  21. 21

    在constexpr类的构造函数外部使用构造函数参数

  22. 22

    使用Ninject的ASP.Net MVC4,HttpPost返回“无参数构造函数”

  23. 23

    在 WinForms.NET 的 CreateParams 中使用传递给表单构造函数的参数

  24. 24

    VB.NET中的C#Webforms用户控件

  25. 25

    使用autofac在.net Core中使用参数(服务)注册上下文

  26. 26

    将VB函数回调作为参数传递给.NET

  27. 27

    类类型作为vb.net中的函数参数

  28. 28

    VB.NET 将函数传递给 Action 参数

  29. 29

    传递给 VB.NET 中的函数时声明参数

热门标签

归档