我正在尝试实现一个类,在第一次呼叫上获取数据库中的一些数据,然后随后的呼叫将在应用程序的寿命中返回相同的数据,即使是新实例这个课程被称为。这可能吗?
这是我的示例尝试,问题是我得到Object not set to an instance of the Object
。
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
才能与本机Session
发生冲突班级)。这样,每当您获得SessionStore
实例时,它将仅使用IUserSessionService
实现的一个实例。
您的SessionStore
看起来像这样:
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<XUserSessionService>().As<IUserSessionService>().SingleInstance();
builder.RegisterType<SessionStore>().As<ISessionStore>().InstancePerRequest();
要获取ISessionStore
实例,您可以在Page
对象中使用属性注入
有关更多信息,请参见文档注入依赖的结构页面和用户控件。
// MyPage.aspx.cs
public partial class MyPage : Page
{
// This property will be set for you by the PropertyInjectionModule.
public ISessionStore SessionStore { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
// Now you can use the property that was set for you.
label1.Text = this.SessionStore.ConnectionString;
}
}
或访问IContainerProviderAccessor
如果您尝试在页面外访问会话。
ILifetimeScope lifetimeScope = ((IContainerProviderAccessor)HttpContext.Current.ApplicationInstance).ContainerProvider.RequestLifetime;
ISession session = lifetimeScope.Resolve<ISessionStore>();