Autofacを使用していて、現在のアセンブリの正しい実装を解決したい
DataContextFactoryインターフェイスとクラスがあります。
Public Interface IDataContextFactory
Inherits IDisposable
Function GetDataContext() As IDataContext
End Interface
およびインターフェースの実装
Public Class CDataContextFactory
Implements IDataContextFactory
Private m_oDbContext As IDataContext
Public Sub New(ByVal i_oDbContext As IDataContext)
m_oDbContext = i_oDbContext
End Sub
Public Function GetDataContext() As CoreData.IDataContext Implements CoreData.IDataContextFactory.GetDataContext
Return m_oDbContext
End Function
End Class
これで、登録されたすべてのアセンブリに異なるIDataContext実装があります。たとえば、データコンテキストを持つReportDataというアセンブリがあります
Public Class CReportDataContext
Inherits DbContext
Implements IDataContext
---
End Class
また、他のAssemblyCommonData内の1つの実装
Public Class CFacadeDataContext
Implements IDataContext
---
End Class
次に、すべてのアセンブリにIRepositoryの実装があります。例えば
Public MustInherit Class CBaseReadRepository(Of T As {IEntity, Class})
Implements IReadRepository(Of T)
Private m_oDataContextFactory As IDataContextFactory
Private m_oDataContext As IDataContext
Protected ReadOnly m_oObjectDataSet As CQuery(Of T)
Public Sub New(ByVal i_oDataContextFactory As IDataContextFactory)
m_oDataContextFactory = i_oDataContextFactory
m_oObjectDataSet = DataContext.ObjectDataSet(Of T)()
End Sub
----
End Class
では、DataContextFactoryがAssemblyReportData内のCReportDataContextとAssemblyCommonData内のCFacadeDataContextを解決することをどのように解決できますか?
これが私のContainerBuilder登録です:
Dim builder As New ContainerBuilder()
Dim oData = Assembly.Load("ReportData")
builder.RegisterAssemblyTypes(oData).Where(Function(t) t.Name.EndsWith("DataContext")).As(Of IDataContext) _
.AsImplementedInterfaces.SingleInstance
oData = Assembly.Load("CommonData")
builder.RegisterAssemblyTypes(oData).Where(Function(t) t.Name.EndsWith("DataContext")) _
.AsImplementedInterfaces().SingleInstance
builder.RegisterAdapter(Of IDataContext, IDataContextFactory)(Function(x) New CDataContextFactory(x))
ありがとう