2010-02-16 6 views
3

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

Répondre

1
+0

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

Questions connexes