Asp.net MVC 4 с StructureMap

Я конвертирую проект ASP.NET MVC3 в MVC4. Я пытался найти лучший подход к работе с StructureMap и MVC4. Я нашел пару решений, которые могут работать, но еще не пробовали их.

Первое решение очень простое и легкий. Второй (Structuremap.MVC4) зависит от WebActivator для запуска.

Каков лучший и самый простой подход? Нужно ли мне все-таки загружать все и устанавливать DependencyResolver с помощью WebActivator?

Спасибо за вашу помощь.

Ответ 1

Я сделал следующее, и он работает. Надеюсь, поможет.

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;
    }