J'ai suivi dans le livre Pro ASP.NET MVC Framework par Steven Sanderson. J'essaie de réécrire une application pour utiliser Unity IoC au lieu de Castle Windsor IoC. Je veux que l'implémentation de Unity enregistre tous les contrôleurs comme celui de Windsor.Comment puis-je convertir cette WindsorControllerFactory à un UnityControllerFactory dans VB.NET ou C#
Voici le code WindorControllerFactory:
public class WindsorControllerFactory : DefaultControllerFactory
{
conteneur WindsorContainer;
// The constructor
// 1. Sets up a new IoC container
// 2. Registers all components specified in web.config
// 3. Registers all controller types as components
public WindsorControllerFactory()
{
// Instantiate a container, taking configuration from web.config
container = new WindsorContainer(
new XmlInterpreter(new ConfigResource("castle"))
);
// Also register all the controller types as transient
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
foreach (Type t in controllerTypes)
container.AddComponentWithLifestyle(t.FullName, t, Castle.Core.LifestyleType.Transient);
}
// Constructs the controller instance needed to service each request
protected override IController GetControllerInstance(Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
Voici ma faible tentative de la mise en œuvre de l'unité:
Public Class UnityControllerFactory
Inherits DefaultControllerFactory
Private _container As New UnityContainer()
Public Property Container() As UnityContainer
Get
Return _container
End Get
Set(ByVal value As UnityContainer)
_container = value
End Set
End Property
Public Sub New()
Dim section As UnityConfigurationSection = DirectCast(ConfigurationManager.GetSection("unity"), UnityConfigurationSection)
section.Containers("SupportSiteContainer").Configure(_container)
'_container.RegisterType(GetType(IRepository(Of)), "IRepository", New TransientLifetimeManager(), Nothing)
Dim controllerTypes = From t In Assembly.GetExecutingAssembly().GetTypes() _
Where GetType(IController).IsAssignableFrom(t) _
Select t
For Each t As Type In controllerTypes
_container.RegisterType(t, t.Name, New TransientLifetimeManager())
' ' _container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient)
Next
End Sub
Public Overloads Function GetControllerInstance(ByVal controllerType As Type) As IController
If controllerType Is Nothing Then
Return Nothing
End If
Return DirectCast(_container.Resolve(controllerType), IController)
End Function
End Class
Voici mon unité Config:
<unity>
<typeAliases>
<!-- Lifetime manager types -->
<typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity"/>
<typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity"/>
<typeAlias alias="transient" type="Microsoft.Practices.Unity.TransientLifetimeManager, Microsoft.Practices.Unity"/>
<typeAlias alias="perThread" type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
<!-- Custom object types -->
<typeAlias alias="IRepository" type="SupportSite.Repository.IRepository`1, SupportSite.Repository"/>
<typeAlias alias="EFRepository" type="SupportSite.Data.EFRepository`1, SupportSite.Data"/>
<typeAlias alias="IUnitOfWork" type="SupportSite.Repository.IUnitOfWork, SupportSite.Repository"/>
<typeAlias alias="EFUnitOfWork" type="SupportSite.Data.EFUnitOfWork, SupportSite.Data"/>
<typeAlias alias="IUnitOfWorkFactory" type="SupportSite.Repository.IUnitOfWorkFactory, SupportSite.Repository"/>
<typeAlias alias="EFUnitOfWorkFactory" type="SupportSite.Data.EFUnitOfWorkFactory, SupportSite.Data"/>
</typeAliases>
<containers>
<container name="SupportSiteContainer">
<types>
<type type="IRepository" mapTo="EFRepository">
<lifetime type="transient" />
</type>
<type type="IUnitOfWork" mapTo="EFUnitOfWork">
<lifetime type="transient" />
</type>
<type type="IUnitOfWorkFactory" mapTo="EFUnitOfWorkFactory">
<lifetime type="transient" />
</type>
</types>
</container>
</containers>
Merci, Matt
Cette mise en œuvre fonctionne comme un champion. Je l'ai malheureusement essayé plus tôt, mais je n'ai pas surchargé GetControllerInstance et je n'ai pas compris pourquoi cela fonctionnait. Merci pour la réponse. En outre, au cas où quelqu'un est curieux de savoir si vous voulez enregistrer un type générique avec l'unité le code ressemble à ceci: « Code container.RegisterType (GetType (IRepository (Of)), GetType (EFRepository (Of))) ou 'config –