Vb.net 仅限Autofac类的实现
我试图实现一个类,该类在第一次调用时从数据库获取一些数据,随后对该类的调用将在应用程序的生命周期内返回相同的数据,即使调用该类的新实例也是如此。这可能吗 这是我的示例尝试,问题是我没有将Vb.net 仅限Autofac类的实现,vb.net,autofac,Vb.net,Autofac,我试图实现一个类,该类在第一次调用时从数据库获取一些数据,随后对该类的调用将在应用程序的生命周期内返回相同的数据,即使调用该类的新实例也是如此。这可能吗 这是我的示例尝试,问题是我没有将对象设置为该对象的实例 Public Class session Implements IContainerProviderAccessor Shared _containerProvider As IContainerProvider Private _IUserSessionService As
对象设置为该对象的实例
Public Class session
Implements IContainerProviderAccessor
Shared _containerProvider As IContainerProvider
Private _IUserSessionService As IUserSessionService ' interface to stores data
Public Property Usersession As IUserSessionService
Get
Return _IUserSessionService
End Get
Set(value As IUserSessionService)
_IUserSessionService = value
End Set
End Property
Public ReadOnly Property ContainerProvider As IContainerProvider Implements IContainerProviderAccessor.ContainerProvider
Get
Return _containerProvider
End Get
End Property
Public Function GetConnection() As String
Dim UserSessionDetail As New UserSessionDetails
' Do we have a container if not register one
If IsNothing(_containerProvider) Then
RegisterConnection()
Dim UserSessionDetail As New UserSessionDetails
UserSessionDetail.connection_string = GoAndGetOneFromOtherSource
Usersession.AddSession(UserSessionDetail)
Return UserSessionDetail.connection_string
Else
Usersession.GetUserSession()
Return UserSessionDetail.connection_string
End If
End Function
Private Sub RegisterConnection()
Dim builder As ContainerBuilder = New ContainerBuilder()
builder.RegisterType(Of UserSessionService).As(Of IUserSessionService).InstancePerRequest()
'Auto Fac Binding
_containerProvider = New ContainerProvider(builder.Build())
End Sub
End Class
您需要将您的IUserSessionService
注册为Autofac中的一个单例,并将其注入到SessionStore
类构造函数中(我使用SessionStore
而不是Session
来与本机会话发生冲突)。
这样,每次您获得一个SessionStore
实例时,它将只使用您的IUserSessionService
实现的一个实例
您的会话存储将如下所示:
public class SessionStore : ISessionStore
{
public SessionStore(IUserSessionService userSessionService)
{
this._userSessionService = userSessionService;
}
private readonly IUserSessionService _userSessionService;
public String ConnectionString
{
get
{
// do what you want with _userSessionService
}
}
}
您的注册将如下所示
builder.RegisterType().As().SingleInstance();
builder.RegisterType().As().InstancePerRequest();
要获取ISessionStore
实例,可以在页面
对象中使用属性注入
有关更多信息,请参阅文档中的
//MyPage.aspx.cs
公共部分类MyPage:第页
{
//PropertyInjectionModule将为您设置此属性。
公共ISessionStore会话存储{get;set;}
受保护的无效页面加载(对象发送方、事件参数e)
{
//现在您可以使用为您设置的属性。
label1.Text=this.SessionStore.ConnectionString;
}
}
或者,如果您尝试在页面之外访问会话,请访问IContainerProviderAccessor
ILifetimeScope lifetimeScope=((IContainerProviderAccessor)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime;
ISession session=lifetimeScope.Resolve();
是的,当然有可能,将数据和方法定义为静态,检查是否已有数据,如果有,返回数据,如果没有,则进行提取……就Autofac而言,这可以通过依赖单例对象或将对象设置为单例对象来实现。每当另一个对象在会话
上声明依赖项时,它将使用同一个对象。老实说,我觉得这有点乱IContainerProviderAccessor
只应用于扩展HttpApplication对象,而不是类似的东西。也许复习一下?