2011-03-31 5 views
0

J'utilise Autofac 2.4.5.724 sous vb.net 2010. J'ai plusieurs classes sans constructeurs par défaut que je veux résoudre par autofac, et je veux les enregistrer en utilisant RegisterAssemblyTypes (ne pas enregistrer les classes un par un). C'est possible?Autofac RegisterAssemblyTypes pour les classes sans constructeur par défaut

Mon interface est comme ceci:

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

La mise en œuvre est comme ceci:

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 

Je peux enregistrer les cours, un par un comme celui-ci:

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

Mais je Je ne veux pas enregistrer les cours un par un, je veux autofac pour scanner mon assemblage:

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

Sinon, puis-je mettre le paramètre constructeur pendant la résolution?

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

Répondre

1

Vous pouvez spécifier le paramètre lors de la résolution. Vous avez juste besoin d'ajouter un ou plusieurs TypedParameters créés en utilisant les paramètres réels de l'appel Resolve; vous ne pouvez pas les passer directement:

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

Maintenant, quand Autofac voit un constructeur pour le type enregistré qui accepte une chaîne, il va remplacer le paramètre donné. Comprenez qu'Autofac sera confus si vous avez un constructeur qui prend plusieurs chaînes; dans ce cas, vous devrez spécifier chaque chaîne comme un paramètre nommé qu'Autofac fera correspondre aux noms des paramètres du constructeur. Cela a ses propres complexités; voir la question SO ici: Autofac parameter passing

1

Dans votre exemple particulier, où vous parlez d'une connexion db, au lieu d'accepter une chaîne représentant la chaîne de connexion, vous pouvez accepter un Func <SqlConnection> puis enregistrez SqlConnection séparément. Ensuite, vous pouvez laisser Autofac résoudre automatiquement le Func <SqlConnection>. Cela éviterait de spécifier l'explicitation du paramètre lors de l'enregistrement.

Questions connexes