Asp.Net MVC Web.config 使用 Unity

筆記用

1.建立專案

2.設定專案

3.按下OK後,會出現下圖

4.開啟【Package Manage Console】

5.開啟後,出現下圖

6.安裝套件

Install-Package Unity -Version 4.0.1
Install-Package Unity.Interception -Version 4.0.1
Install-Package Unity.Mvc -Version 4.0.1

7.新增UnityConfig.vb、UnityMvcActivator.vb 2個檔案於 \\App_Start\

UnityConfig.vb

Imports System
Imports Microsoft.Practices.Unity
Imports Microsoft.Practices.Unity.Configuration
Imports Microsoft.Practices.Unity.InterceptionExtension
Imports Microsoft.Practices.ServiceLocation
Imports System.Reflection

''' <summary>
''' Specifies the Unity configuration for the main container.
''' </summary>
Public Class UnityConfig
#Region "Unity Container"
    Private Shared ReadOnly _Container As Lazy(Of IUnityContainer) = New Lazy(Of IUnityContainer)(
        Function()
            Dim container = New UnityContainer()

            'Unityの設定を読み込む
            container.LoadConfiguration(containerName)

            'ServiceLoacatorにUnityを登録する
            Dim service As New UnityServiceLocator(container)
            ServiceLocator.SetLocatorProvider(Function() service)

            RegisterTypes(container)
            Return container
        End Function)

    ''' <summary>
    ''' Gets the configured Unity container.
    ''' </summary>
    Public Shared Function GetConfiguredContainer() As IUnityContainer
        Return _Container.Value
    End Function
    
#End Region

    ''' <summary>Registers the type mappings with the Unity container.</summary>
    ''' <param name="container">The unity container to configure.</param>
    ''' <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
    ''' change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
    Public Shared Sub RegisterTypes(container As IUnityContainer)

    End Sub


End Class

UnityMvcActivator.vb

Imports System.Linq
Imports System.Web.Mvc
Imports Microsoft.Practices.Unity.Mvc
Imports Microsoft.Web.Infrastructure.DynamicModuleHelper

<Assembly: WebActivatorEx.PreApplicationStartMethod(GetType(UnityMvcActivator), "Start")> 
<Assembly: WebActivatorEx.ApplicationShutdownMethod(GetType(UnityMvcActivator), "Shutdown")> 

''' <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
Public NotInheritable Class UnityMvcActivator

    ''' <summary>
    ''' This is static class.
    ''' </summary>    
    Private Sub New()
    End Sub


    ''' <summary>
    ''' Integrates Unity when the application starts.
    ''' </summary>
    Public Shared Sub Start()
        Dim container = UnityConfig.GetConfiguredContainer()

        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType(Of FilterAttributeFilterProvider)().First())
        FilterProviders.Providers.Add(New UnityFilterAttributeFilterProvider(container))

        DependencyResolver.SetResolver(New UnityDependencyResolver(container))

        DynamicModuleUtility.RegisterModule(GetType(UnityPerRequestHttpModule))
    End Sub

    ''' <summary>
    ''' Disposes the Unity container when the application is shut down.
    ''' </summary>
    Public Shared Sub Shutdown()
        Dim container = UnityConfig.GetConfiguredContainer()
        container.Dispose()
    End Sub

End Class

8.添加 System.Runtime.Version=4.0.0.0 Culture=neutral

9.Web.config檔中添加

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

10.添加Unity.Local.config

Unity.Local.config

<!--unity-->
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <!--Interception設定ファイル用-->
  <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration" />

  <namespace name="專安名稱" />
  <namespace name="專安名稱.Services" />
  <assembly name="專安名稱" />

  <container>
    <extension type="Interception" />
    <register type="System.Collections.Generic.IList`1[string]"
             mapTo="System.Collections.Generic.List`1[string]"
             name="CreateTypeListA">
      <constructor>
      </constructor>
      <method name="AddRange">
        <param name="collection" >
          <array type="string[]">
            <value value="値2"/>
            <value value="値1"/>
          </array>
        </param>
      </method>
    </register>
  </container>

</unity>

10 測試

HomeController.vb中添加

Dim lt As IList(Of String) = ServiceLocator.Current.GetInstance(Of IList(Of String))("CreateTypeListA")

11.出現下圖即完成