Search code examples
dependency-injectionstructuremapobjectfactory

Structuremap in MVC5


I'm using structuremap 3.1.2.138 in MVC5. In my IoC-class i'm trying to use the Objectfactory but it states Objectfactory is obsolete and I should use Container but I can't find a way to make this work.

public static IContainer Initialize() {
        var BS_WebDataContextConnectionString = "Data Source=xxx;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True";

        ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                    {
                        scan.Assembly(Assembly.GetCallingAssembly());
                        scan.WithDefaultConventions();
                    });

                //DataContext
                x.For<iBS_WebDataContext>().Use<BS_WebDataContext>()
                    .Ctor<string>("connectionString")
                    .Is(BS_WebDataContextConnectionString);

                //Repositories
                x.For<IReadOnlyEvidenceTypeRepository>().Use<EF6ReadOnlyEvidenceTypeRepository>();
                x.For<IReadOnlyStatusCategoryRepository>().Use<EF6ReadOnlyStatusCategoryRepository>();



                //Services
                x.For<IEvidenceTypeService>().Use<EvidenceTypeService>();
                x.For<IStatusCategoryService>().Use<StatusCategoryService>();


            });
        return ObjectFactory.Container;

}

Could anyone give me an example how to convert this to the container-way?


Solution

  • It would be done like so (including moving your configurations into a registry to keep it nice and tidy.

    WebsiteRegistry.cs

    public class WebsiteRegistry : Registry
    {
        public WebsiteRegistry()
        {
            x.Scan(scan =>
            {
                scan.Assembly(Assembly.GetCallingAssembly());
                scan.WithDefaultConventions();
            });
    
            //DataContext
            var BS_WebDataContextConnectionString = "Data Source=xxx;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True";
            x.For<iBS_WebDataContext>().Use<BS_WebDataContext>().Ctor<string>("connectionString").Is(BS_WebDataContextConnectionString);
    
            //Repositories
            x.For<IReadOnlyEvidenceTypeRepository>().Use<EF6ReadOnlyEvidenceTypeRepository>();
            x.For<IReadOnlyStatusCategoryRepository>().Use<EF6ReadOnlyStatusCategoryRepository>();
    
            //Services
            x.For<IEvidenceTypeService>().Use<EvidenceTypeService>();
            x.For<IStatusCategoryService>().Use<StatusCategoryService>();
        }
    }
    

    Then registered like so:

    IContainer yourContainer = new Container();
    yourContainer.Configure(c =>
    {
        c.IncludeRegistry<WebsiteRegistry>();
    });