10

ASP.NET MVC3 プロジェクトを MVC4 に変換しています。StructureMap と MVC4 を操作するための最良のアプローチを見つけようとしていました。うまくいくかもしれない解決策をいくつか見つけましたが、まだ試していません。

最初のソリューションは、非常にシンプルで軽量です。2 つ目 ( Structuremap.MVC4 ) は、起動時に WebActivator に依存します。

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

ご協力いただきありがとうございます。

4

1 に答える 1

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;
    }
于 2012-08-31T18:00:42.307 に答える