2011-03-31 86 views
0

我在vb.net 2010下使用Autofac 2.4.5.724。我有幾個沒有默認構造函數的類,我想autofac解決,我想用RegisterAssemblyTypes註冊它們(不註冊類逐個)。可能嗎?Autofac RegisterAssemblyTypes沒有默認構造函數的類

我的界面是這樣的:

Namespace Repo 
    Public Interface IPeople 
     Function All() As IList(Of RCO.People) 
    End Interface 
End Namespace 

實現是這樣的:

Dim builder = New ContainerBuilder 
builder.Register(
    Function(x) New MyLib.Repo.People("Data Source=localhost...") 
).As(Of MyLib.Repo.IPeople)() 
Dim container = builder.Build 
Dim peep = container.Resolve(Of MyLib.Repo.IPeople)() 

但我:

Namespace Repo 
    Public Class People 
     Inherits Base 
     Implements IPeople 

     Public Sub New(ByVal cs As String) 
      MyBase.New(cs) 
     End Sub 

     Public Function All() As IList(Of RCO.People) Implements IPeople.All 
      ... 
     End Function 

    End Class 
End Namespace 

我可以一個個像這樣登記類不想一個一個地註冊課程,我想用autofac來掃描我的程序集:

Dim builder = New ContainerBuilder 
builder.RegisterAssemblyTypes(Reflection.Assembly.Load("MyLib")).Where(
    Function(x) x.Namespace = "Repo").AsImplementedInterfaces() ...what else?... 
Dim container = builder.Build 
Dim peeprepo = container.Resolve(Of ReportCenterLib.Repo.IPeople)() 

或者,我可以在解析期間放置構造函數參數嗎?

Dim peeprepo = container.Resolve(Of ReportCenterLib.Repo.IPeople)(...here?...) 

回答

1

您可以在解析時明確指定參數。您只需將使用實際參數創建的一個或多個TypedParameters添加到Resolve調用;你不能直接通過他們:

Dim peeprepo = container.Resolve(Of ReportCenterLib.Repo.IPeople)(TypedParameter.From("Data Source=localhost...")) 

現在,當Autofac看到一個構造函數,它接受一個字符串類型註冊,它將替代給定的參數。理解如果你有一個構造函數需要多個字符串,Autofac會感到困惑;在這種情況下,您需要將每個字符串指定爲Autofac將與構造函數參數名稱匹配的命名參數。這有其自身的複雜性;看到SO問題在這裏:Autofac parameter passing

1

在你的具體的例子,在那裏你說的不是接受代表的連接字符串的字符串有關數據庫連接,你可以接受函數求<的SqlConnection >然後單獨註冊的SqlConnection。然後,您可以讓Autofac自動解析Func <SqlConnection>。這樣可以避免在註冊過程中需要指定參數的顯式。

相關問題