2017-03-07 13 views
0

最初に呼び出したときにデータベースからデータを取得し、このクラスの後続の呼び出しがアプリケーションの存続期間中同じデータを返すクラスを実装しようとしています。と呼ばれる。これは可能ですか?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 
+0

うん、もちろんそれが可能だ、Autofacの面では...あなたはすでにデータがある場合はそれを返すならば、フェッチしない場合、確認するために – Trey

+1

をチェックし、静的なデータとメソッドを定義し、これをシングルトンオブジェクトに依存するか、またはオブジェクトをシングルトンにすることによって実行できます。別のオブジェクトが 'session'に依存関係を宣言すると、常に同じオブジェクトが使用されます。正直言って、これは私にはちょっと混乱しているようです。 'IContainerProviderAccessor'はHttpApplicationオブジェクトを拡張するためだけに使うべきで、このようなものではありません。おそらく[統合ドキュメント](http://autofac.readthedocs.io/en/latest/integration/webforms.html)を見直してください。 –

答えて

0

あなたはAutofacでシングルトンとしてごIUserSessionServiceを登録し、(私はネイティブSessionクラスとの競合を持っているSessionStoreの代わりSessionを使用してください)あなたのSessionStoreクラスのコンストラクタでそれを注入する必要があります。 この方法では、SessionStoreインスタンスを取得するたびに、IUserSessionService実装のインスタンスを1つだけ使用します。

あなた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(); 

あなたは

は、より多くの情報のドキュメントからstructuring pages and user controls for Dependency Injectionを参照してくださいPageオブジェクトのプロパティインジェクションを使用することができますISessionStoreインスタンスを取得します。

// 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>(); 
関連する問題