2012-08-31 112 views
10

我将一个ASP.NET MVC3项目转换为MVC4。我试图找到使用StructureMap和MVC4的最佳方法。我找到了一些解决方案,可以工作,但还没有尝试过。asp.net MVC 4与StructureMap

第一个解决方案非常简单,并且lightweight。第二个(Structuremap.MVC4)依赖于WebActivator的启动。

什么是更好和最简单的方法?我是否仍然需要引导所有内容并使用WebActivator设置DependencyResolver?

感谢您的帮助。

回答

14

我做了以下,它的工作原理。希望能帮助到你。

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

感谢您help.I'll尝试你的代码,我会尽快给你一些反馈。 – LeftyX

+1

您返回服务集合的部分应更改为_container.GetAllInstances(serviceType).Cast () –