Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 仅限Autofac类的实现_Vb.net_Autofac - Fatal编程技术网

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对象,而不是类似的东西。也许复习一下?