asp.net MVC 4 with StructureMap
Asked Answered
S

1

9

I am converting an ASP.NET MVC3 project to MVC4. I was trying to find the best approach to work with StructureMap and MVC4. I've found a couple of solution which might work, but haven't tried them yet.

The first solution is very simple and lightweight. The second one (Structuremap.MVC4) depends on WebActivator for the startup.

What is the better and simplest approach? Do I still need to bootstrap everything and set the DependencyResolver with the WebActivator?

Thanks for your help.

Sullen answered 31/8, 2012 at 15:22 Comment(0)
T
13

I did the following and it works. hope it helps.

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;
    }
Tennes answered 31/8, 2012 at 18:0 Comment(2)
Thanks for your help.I'll try your code and I'll get back to you with some feedback.Sullen
The section where you return a collection of services should be changed to _container.GetAllInstances(serviceType).Cast<object>()Clemmy

© 2022 - 2024 — McMap. All rights reserved.