Difference between revisions of "StructureMap Implementation"

From Logic Wiki
Jump to: navigation, search
(Created page with "Category:MVC Category:CSharp * Get Structuremap package from NuGet * Get Servicelocation package from NuGet * Create folder DependencyInjection for Ioc Classes * Copy...")
 
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
[[Category:MVC]]
 
[[Category:MVC]]
 
[[Category:CSharp]]
 
[[Category:CSharp]]
−
 
+
== In MVC 5 ==
 
* Get Structuremap package from NuGet
 
* Get Structuremap package from NuGet
 
* Get Servicelocation package from NuGet
 
* Get Servicelocation package from NuGet
 
* Create folder DependencyInjection for Ioc Classes
 
* Create folder DependencyInjection for Ioc Classes
−
* Copy the classes from old project ( [DependencyScope:DependencyScope] DependencyScope , DependencyResolver)
+
* Copy the classes from old project ( [[DependencyScope]], [[DependencyResolver]])
 
* Copy DependencyScope and DependencyResolver into the folder ‘DependencyInjection‘
 
* Copy DependencyScope and DependencyResolver into the folder ‘DependencyInjection‘
 
* Resolve classes names
 
* Resolve classes names
Line 11: Line 11:
 
** System.Web.Http
 
** System.Web.Http
 
** System.Web.Http.WebHost
 
** System.Web.Http.WebHost
−
* Create IocConfig (copy code from the old project)
+
* Create [[IocConfig]] (copy code from the old project)
 
* Resolve Dependencies
 
* Resolve Dependencies
 
* Add IocConfig call to Global.asax.cs (reference newly created DependencyResolver Class)
 
* Add IocConfig call to Global.asax.cs (reference newly created DependencyResolver Class)
 +
<pre>
 +
      protected void Application_Start()
 +
        {
 +
            var container = IocConfig.Setup();
 +
            System.Web.Mvc.DependencyResolver.SetResolver(new DependencyResolver(container));
 +
            GlobalConfiguration.Configuration.DependencyResolver = new DependencyResolver(container);
 +
</pre>
 
* Different configurations for API project
 
* Different configurations for API project
 
* For API project you may not need this statement
 
* For API project you may not need this statement
 +
<pre>
 
System.Web.Mvc.DependencyResolver.SetResolver(new DependencyInjection.DependencyResolver(container));
 
System.Web.Mvc.DependencyResolver.SetResolver(new DependencyInjection.DependencyResolver(container));
 +
</pre>
 
* For static methods concrete object can be get using the similar statement given below
 
* For static methods concrete object can be get using the similar statement given below
 +
<pre>
 
var storeService = IocConfig.Setup().GetInstance<IUserStoreService<ApplicationUser>>();
 
var storeService = IocConfig.Setup().GetInstance<IUserStoreService<ApplicationUser>>();
 +
</pre>
 +
== In MVC 6 ==
 +
* Create IoC project in solution
 +
* install StructureMap.Microsoft.DependencyInjection nuget package in IoC project
 +
* Add project references to IoC but not the UI ones
 +
* create a class file and write the code below
 +
<pre class="brush:csharp;">
 +
    public class InstanceScanner : Registry
 +
    {
 +
        public static IContainer Setup()
 +
        {
 +
            var container = new Container(
 +
                x =>
 +
                {
 +
                    x.Scan(k =>
 +
                    {
 +
                        k.TheCallingAssembly();
 +
                        k.WithDefaultConventions();  // if interface has I in front of implementation you don't need to define again
 +
                        k.AssembliesFromApplicationBaseDirectory();
 +
                    });
 +
                //  x.For<ITest>().Use<Test>();    //If naming conventions are not implemented
 +
                }
 +
                );
 +
            return container;
 +
        }
 +
    }
 +
</pre>
 +
* in UI (Main) project add IoC project reference
 +
* in Startup.cs file
 +
<pre class="brush:csharp;">
 +
  public IServiceProvider ConfigureServices(IServiceCollection services) // THIS CAN BE VOID BUT CHANGE IT TO RETURN IServiceProvider
 +
        {
 +
            // Add framework services.
 +
            services.AddMvc();
 +
          return ConfigureIoC(services);
 +
        }
 +
  public IServiceProvider ConfigureIoC(IServiceCollection services)
 +
        {
 +
          var  container = InstanceScanner.Setup();    // referencing the code above
 +
          container.Populate(services);
 +
          return container.GetInstance<IServiceProvider>();
 +
        }
 +
</pre>
 +
* That's it.
 +
** If an interface is starts with "I" and class name you don't need to do anything.
 +
** If naming conventions are not implemented uncomment the relevant part above.
 +
--------------------
 +
Note :
 +
 +
For<MyContext>().Use(() => new MyContext("LocalhostConnString"));
 +
 +
If you give StructureMap an object instance, it will treat that instance as a singleton and return the same one every time. If instead you give it a lambda that creates an instance, it will run that lambda each time the type is requested.

Latest revision as of 11:18, 28 March 2017

In MVC 5

  • Get Structuremap package from NuGet
  • Get Servicelocation package from NuGet
  • Create folder DependencyInjection for Ioc Classes
  • Copy the classes from old project ( DependencyScope, DependencyResolver)
  • Copy DependencyScope and DependencyResolver into the folder ‘DependencyInjection‘
  • Resolve classes names
  • To resolve interface IDependencyScope Add references to
    • System.Web.Http
    • System.Web.Http.WebHost
  • Create IocConfig (copy code from the old project)
  • Resolve Dependencies
  • Add IocConfig call to Global.asax.cs (reference newly created DependencyResolver Class)
       protected void Application_Start()
        {
            var container = IocConfig.Setup();
            System.Web.Mvc.DependencyResolver.SetResolver(new DependencyResolver(container));
            GlobalConfiguration.Configuration.DependencyResolver = new DependencyResolver(container);
  • Different configurations for API project
  • For API project you may not need this statement
	System.Web.Mvc.DependencyResolver.SetResolver(new DependencyInjection.DependencyResolver(container));
  • For static methods concrete object can be get using the similar statement given below
	var storeService = IocConfig.Setup().GetInstance<IUserStoreService<ApplicationUser>>();

In MVC 6

  • Create IoC project in solution
  • install StructureMap.Microsoft.DependencyInjection nuget package in IoC project
  • Add project references to IoC but not the UI ones
  • create a class file and write the code below
    public class InstanceScanner : Registry
    {
        public static IContainer Setup()
        {
            var container = new Container(
                x =>
                {
                    x.Scan(k =>
                    {
                        k.TheCallingAssembly();
                        k.WithDefaultConventions();   // if interface has I in front of implementation you don't need to define again
                        k.AssembliesFromApplicationBaseDirectory();
                    });
                 //   x.For<ITest>().Use<Test>();     //If naming conventions are not implemented 
                }
                );
            return container;
        }
    }
  • in UI (Main) project add IoC project reference
  • in Startup.cs file
  public IServiceProvider ConfigureServices(IServiceCollection services) // THIS CAN BE VOID BUT CHANGE IT TO RETURN IServiceProvider
        {
            // Add framework services.
            services.AddMvc();
           return ConfigureIoC(services);
        }
  public IServiceProvider ConfigureIoC(IServiceCollection services)
        {
           var  container = InstanceScanner.Setup();    // referencing the code above 
           container.Populate(services);
           return container.GetInstance<IServiceProvider>();
        }
  • That's it.
    • If an interface is starts with "I" and class name you don't need to do anything.
    • If naming conventions are not implemented uncomment the relevant part above.

Note :

For<MyContext>().Use(() => new MyContext("LocalhostConnString"));

If you give StructureMap an object instance, it will treat that instance as a singleton and return the same one every time. If instead you give it a lambda that creates an instance, it will run that lambda each time the type is requested.