Autofac RegisterAssembly类型,用于没有默认构造函数的类

时间:2011-03-31 13:44:44

标签: autofac

我在vb.net 2010下使用Autofac 2.4.5.724。我有几个没有默认构造函数的类,我想让autofac解析,我想使用RegisterAssemblyTypes注册它们(不是逐个注册类)。有可能吗?

我的界面是这样的:

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

实施是这样的:

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

我可以像这样逐个注册课程:

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)()

但是我不想逐个注册这些类,我想让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?...)

2 个答案:

答案 0 :(得分:1)

您可以在解析时明确指定参数。您只需要将使用实际参数创建的一个或多个TypedParameter添加到Resolve调用中;你无法直接传递它们:

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

现在,当Autofac看到接受字符串的注册类型的构造函数时,它将替换给定的参数。理解如果你有一个带有多个字符串的构造函数,Autofac会感到困惑;在这种情况下,您需要将每个字符串指定为一个命名参数,Autofac将与构造函数参数名称匹配。这有其自身的复杂性;在这里看到SO问题:Autofac parameter passing

答案 1 :(得分:1)

在您的特定示例中,您正在讨论数据库连接,而不是接受表示连接字符串的字符串,您可以接受Func< SqlConnection>然后单独注册SqlConnection。然后你可以让Autofac自动解析Func< SqlConnection>。这样就可以避免在注册期间指定参数明确性。