Configuring Unity 2.0 Web.config with MVC

I am trying to use Unity 2.0 for my current project with MVC and cannot configure the parameterization setting in the web.config file.

Here is what I have:

1) Home controller:

public class HomeController : Controller
{
    IRepository repository = null;

    public HomeController()
    {
       // Always calls this constructor. Why? 
       // Should be calling the constructor below that takes IRepository.
    }

    public HomeController(IRepository repository)
    {
        // Should be calling this constructor!!!
        this.repository = repository;
    }
    public ActionResult Index()
    {
        List<int> intList = this.repository.GetInts();

        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

Basic controller with two constructors. The first takes no arguments, and the second takes an IRepository as an argument (which must be entered by Unity)

2) SQL repository

public class SQLRepository : IRepository
{
    private string connectionString = null;

    public SQLRepository(string connectionString)
    {
        this.connectionString = connectionString;
    }

    #region IRepository Members

    public List<int> GetInts()
    {
        return new List<int>() { 1, 2, 3, 4, 5 };
    }

    #endregion
}

The future is an SQL repository, but at the moment it just implements 1 member of the IRepository interface, namely GetInts () and returns a list of integers.

3) IRepository Interace

public interface IRepository
{
    List<int> GetInts();
}

Interface.

4) Application_Start ( ) event in the Global.asax file.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        IUnityContainer container = new UnityContainer();

        UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
        section.Configure(container, "Default");
    }

Unity 2.0 web.config ..

6) Unity 2.0 web.config

<unity>
<typeAliases>
  <typeAlias alias="string" type="System.String, mscorlib" />
  <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
  <typeAlias alias="IRepository" type="NewMVCApp.Interfaces.IRepository, NewMVCApp" />
  <typeAlias alias="SQLRepository" type="NewMVCApp.Repository.SQLRepository, NewMVCApp" />
</typeAliases>
<containers>
  <container name="Default">
    <types>
      <type type="IRepository" mapTo="SQLRepository">
        <lifetime type="singleton" />
        <constructor>
          <param name="connectionString">
            <value value="ApplicationServices" />
          </param>
        </constructor>
      </type>
    </types>
  </container>
</containers>

Unity 2.0, . , TypeAlias ​​ IRepository SQLRepository, IRepository SQLRepository. IRepository , SQLRepository. , SQLRepository.

5) , ?

Unity 2.0 IRepository (SQLRepository) HomeController. - defaultless HomeController(). HomeController ( IRepository) . , web.config. , , HomeController. , :)

& :)

+3
3

Unity . , Unity MVC, , MVC , .

. -, IControllerFactory. :

public class UnityControllerFactory : DefaultControllerFactory
{
    private readonly IUnityContainer container;

    public UnityControllerFactory(IUnityContainer container)
    {
        this.container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if(controllerType != null)
            return container.Resolve(controllerType) as IController;
        return base.GetControllerInstance(requestContext, controllerType);
    }
}

-, , MVC- factory . Application_Start. :

ControllerBuilder.Current.SetControllerFactory(
    new UnityControllerFactory(container));

, , .

+6

, ! ! Application_Start() MVC2 Unity 2.0:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        IUnityContainer container = new UnityContainer();

        IControllerFactory controllerFactory = new UnityControllerFactory(container);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);

        // Do the line below only if you want to Register IoC programatically
        //container.RegisterType<IRepository, SQLRepository>(new ContainerControlledLifetimeManager());

        UnityConfigurationSection section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
        section.Configure(container, "Default");
    }
+1

Unity.Mvc nuget. container.LoadConfiguration(); UnityConfig.

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.LoadConfiguration();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}

Then you can update web.config as shown below.

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity configSource="unity.config" />

The full article can be found @ MVC 5 with Unity for dependency injection .

0
source

Source: https://habr.com/ru/post/1769366/


All Articles