2012-08-31 10 views
10

ASP.NET MVC3プロジェクトをMVC4に変換しています。私はStructureMapとMVC4で作業するための最良の方法を見つけようとしていました。私はうまくいく可能性がある解決策をいくつか見つけましたが、まだ試していません。asp.net MVC 4 with StructureMap

最初の解決策は非常に簡単で、lightweightです。 2番目のファイル(Structuremap.MVC4)は、起動時にWebActivatorに依存します。

もっと簡単で簡単なアプローチは何ですか?私はまだすべてをブートストラップし、DependencyResolverをWebActivatorで設定する必要がありますか?

ありがとうございました。

答えて

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:あなたのhelp.I'llため

 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

おかげで、あなたのコードを試してみて、私はいくつかのフィードバックをあなたに戻って取得します。 – LeftyX

+1

サービスのコレクションを返すセクションは、_container.GetAllInstances(serviceType).Cast ()に変更する必要があります。 –