使用 Unity(DI)+Oracle.ManagedDataAccess+Unity.config 連接DB (Oracle版)

記錄,學習用
參考來源:

1.Unity(DI)でDBに接続してみよう    http://mk3008net.hatenablog.com/entry/2017/01/09/001325

2.WebアプリからOracleに接続するconnectionStrings(tnsname.ora不要)    https://qiita.com/lainzero/items/32f424c98544c7a1b2fe

使用工具
Visual Studio 安裝以下套件*(NuGet)

==== Unity ====
Install-Package CommonServiceLocator -Version 1.3.0
Install-Package Unity -Version 4.0.1
Install-Package Unity.Interception -Version 4.0.1
==== Oracle DB接続 ====
Install-Package Oracle.ManagedDataAccess -Version 12.1.24160719

Step1:安裝完成後將App.config修改成

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- Unity設定 -->
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity configSource="Unity.config"/>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
</configuration>

Step2:建立Unity.config檔

<!-- unity -->
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

  <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration" />
  <!-- DBコネクション -->
  <alias alias="IDbConnection" type="System.Data.IDbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <alias alias="IDbCommand" type="System.Data.IDbCommand, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <alias alias="OracleConnection" type="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <alias alias="OracleCommand" type="Oracle.ManagedDataAccess.Client.OracleCommand, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

  <container>
    <extension type="Interception" />
    <!-- tnsname.ora不要 -->
    <instance name="constrExhibit" value="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ホスト名)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=サービス名))); User Id=ユーザー名; Password=パスワード"  />

    <register type="IDbConnection" mapTo="OracleConnection" name="conExhibit">
      <constructor>
        <param name="connectionString" dependencyName="constrExhibit" />
      </constructor>
      <method name="Open" />
      <lifetime type="singleton" />
    </register>

    <register type="IDbCommand" mapTo="OracleCommand" name="cmdExhibit">
      <constructor>
        <param name="cmdText" value="dummy-sql" />
        <param name="conn" dependencyName="conExhibit" />
      </constructor>
      <property name="BindByName" value="True" />
      <interceptor type="InterfaceInterceptor" />
      <policyInjection />
    </register>

  </container>
</unity>

Step3:修改Module1.vb檔

Imports Microsoft.Practices.ServiceLocation
Imports Microsoft.Practices.Unity.Configuration
Imports Microsoft.Practices.Unity

Module Module1

    Sub Main()

        Dim container As New UnityContainer()
        container.LoadConfiguration()
        Dim service As New UnityServiceLocator(container)
        ServiceLocator.SetLocatorProvider(Function() service)

        Using cmd = ServiceLocator.Current.GetInstance(Of IDbCommand)("cmdExhibit")
            cmd.CommandText = "SELECT CURRENT_TIMESTAMP FROM DUAL"
            Dim d = cmd.ExecuteScalar()
            Console.WriteLine(d)
        End Using

        Console.WriteLine("何かキーを押してください")
        Console.ReadKey()

    End Sub

End Module