Web表单Autofac参数使用给构造器,VB.NET

问题描述 投票:0回答:1

所以,我想要做的,我觉得应该是什么这样一个简单的任务......在一个参数传递给构造函数使用Autofac!

不过,我已经成功地得到解决工作中的工作,但只是不认为这是正确的,我觉得我chaning太多的建议代码从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”使用实际的对象,而不是接口(其中,又似乎是错误不必改变太多),是指现在我的网页表单公共财产不被设置(但是,因为我的解决,我不需要说反正) 另外,还要注意的private _myClass ......这是我的解决办法 所以,现在在我的网上表格init方法,我有以下几点: WebForm1.aspx.vb *

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

现在我的实例在...这是伟大的,正确whoopadeedoo注入参数_myClass ......但我不认为这是正确的。

现在,当我没有需要的一个参数construtor通过,它的所有工作不错,didnt需要从autofac指南更改任何代码,它只是工作,将公共财产我webform.aspx页罚款,是非常好。 但是,当我开始一个放慢参数传递到construtor工作,似乎一切都需要进行调整,以便它是否行得通呢?这个对吗? 我甚至试图从autofac的deligate指导,但也通过我的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")

甚至尝试没有“调用”,但“不能被索引,因为它没有默认属性”

万一有帮助,这里是“我的班”

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的,但我想了解如何将此传递到构造函数,因此,我的问题: 如果这不是如何做到这一点(这我希望它不是正确的),我会怎么做,而不需要改变所有的全局设置? 难道最好使用deligate工厂或只是解决? 我真的需要改变全球集装箱被共享/静态的,这样我可以从我的代码中访问容器?

asp.net webforms autofac
1个回答
1
投票

因此,有两种方法,但首先,不应该需要惹周围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解决(这就是为什么我想我的代码wasnt工作开始),并已实例化对象与空的构造!

2:使用委托厂

行qazxsw POI是不正确的,它应该使用一个功能Autofac到全自动设置这个了!所以应该是:qazxsw POI

在Global.asax中,我只需要添加此Public Delegate Sub Factory(myID As integer),因为我们需要一个参数,并使用一个工厂,我们不能追加Public Delegate Function Factory(myID As integer) as MyClass

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

 builder.RegisterType(Of MyClass)().InstancePerLifetimeScope()

然而,我调整略这样的:

.As(Of IMyClass)
© www.soinside.com 2019 - 2024. All rights reserved.