2012-08-31 11 views
10

Konwertuję projekt ASP.NET MVC3 na MVC4. Próbowałem znaleźć najlepsze podejście do pracy z StructureMap i MVC4. Znalazłem kilka rozwiązań, które mogą zadziałać, ale jeszcze ich nie wypróbowałem.asp.net MVC 4 z StructureMap

Pierwsze rozwiązanie jest bardzo proste i lightweight. Drugi (Structuremap.MVC4) zależy od WebActivator dla uruchomienia.

Jakie jest lepsze i najprostsze podejście? Czy nadal muszę załadować wszystko i ustawić DependencyResolver za pomocą narzędzia WebActivator?

Dzięki za pomoc.

Odpowiedz

14

Zrobiłem co następuje i to działa. mam nadzieję, że to pomoże.

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

Dzięki za help.I'll spróbuj kod i wrócę do was z pewnym sprzężeniem zwrotnym. – LeftyX

+1

Sekcję, w której zwracasz kolekcję usług, należy zmienić na _container.GetAllInstances (serviceType) .Cast () –