2012-08-31 21 views
10

Sto convertendo un progetto ASP.NET MVC3 in MVC4. Stavo cercando di trovare l'approccio migliore per lavorare con StructureMap e MVC4. Ho trovato un paio di soluzioni che potrebbero funzionare, ma non le ho ancora provate.asp.net MVC 4 con StructureMap

La prima soluzione è molto semplice e lightweight. Il secondo (Structuremap.MVC4) dipende da WebActivator per l'avvio.

Qual è l'approccio migliore e più semplice? Devo ancora eseguire il bootstrap di tutto e impostare DependencyResolver con WebActivator?

Grazie per il vostro aiuto.

risposta

14

Ho fatto quanto segue e funziona. spero che sia d'aiuto.

public class StructureMapDependencyResolver : IDependencyResolver 
    { 
     private readonly IContainer _container; 

     public StructureMapDependencyResolver(IContainer container) 
     { 
      _container = container; 
     } 

     public object GetService(Type serviceType) 
     { 
      if (serviceType.IsAbstract || serviceType.IsInterface) 
      { 

       return _container.TryGetInstance(serviceType); 

      } 

      return _container.GetInstance(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType); 
     } 

    } 

Global.asax:

 protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     var container = ConfigureDependencies(); 

     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new StructureMapDependencyResolver(container)); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

    public static IContainer ConfigureDependencies() 
    { 
     IContainer container = new Container(); 

     Database.SetInitializer(new DataContextInitializer()); 
     var dataContext = new DataContext.DataContext(); 

     container.Configure(x => x.For<IRepository>().Use<Repository>().Ctor<DbContext>().Is(dataContext)); 
     container.Configure(x=>x.For<IUnitOfWork>().Use<UnitOfWork>()); 

     return container; 
    } 
+0

Grazie per la vostra help.I'll provare il codice e io tornare a voi con un feedback. – LeftyX

+1

La sezione in cui si restituisce una raccolta di servizi deve essere modificata in _container.GetAllInstances (serviceType). Fast () –