AUTOFAC类仅实现



我正在尝试实现一个类,在第一次呼叫上获取数据库中的一些数据,然后随后的呼叫将在应用程序的寿命中返回相同的数据,即使是新实例这个课程被称为。这可能吗?

这是我的示例尝试,问题是我得到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>();

最新更新