DI(.NET)

ビジネスロジック対象

public interface ILogger

{

void Write(string message);

}

[Export("ILogger", typeof(ILogger))] ← MEFの場合に必要

public class ConsoleLogger : ILogger

{

public void Write(string message)

{

Console.WriteLine(String.Format("Message:{0}", message));

}

}

Unity

Enterprise Library 4.0

public static ILogger GetLogger()

{

//コンテナ初期化

IUnityContainer container = new UnityContainer();

//設定

UnityConfigurationSection config =

ConfigurationManager.GetSection("unity") as UnityConfigurationSection;

UnityConfigurationSection.CurrentSection.Configure(container);

//コンテナから取得

ILogger logger = container.Resolve<ILogger>("Logger");

return logger;

}

ILogger logger = GetLogger();

logger.Write("xxx");

設定ファイル

<configuration>

<configSections>

<section name="unity"

type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,

Microsoft.Practices.Unity.Configuration"/>

</configSections>

<unity>

<typeAliases>

<typeAlias alias="ConsoleLogger"

type="MyNamespace.ConsoleLogger, MyNamespace" />

<typeAlias alias="ILogger" type="MyNamespace.ILogger, MyNamespace" />

</typeAliases>

<containers>

<container>

<types>

<type name="Logger" type="ILogger" mapTo="ConsoleLogger" />

</types>

</container>

</containers>

</unity>

</configuration>

Spring.NET

//コンテナ初期化

IApplicationContext context = ContextRegistry.GetContext();

//コンテナから取得

ILogger Logger = context.GetObject("Logger") as ILogger;

Logger.Write("xxx");

設定ファイル

<configuration>

<configSections>

<sectionGroup name="spring">

<section name="context"

type="Spring.Context.Support.ContextHandler, Spring.Core"/>

<section name="objects"

type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />

</sectionGroup>

</configSections>

<spring>

<context>

<resource uri="config://spring/objects"/>

</context>

<objects xmlns="http://www.springframework.net">

<object id="Logger" type="MyNamespace.ConsoleLogger, MyNamespace" >

</object>

</objects>

</spring>

</configuration>

MEF(Managed Extensibility Framework )

NET Framework 4.0

System.ComponentModel.Composition

設定ファイル不要

public class Manager

{

[Import("ILogger")]

public ILogger Logger { get; set; }

public Manager()

{

var catalog = new AggregateCatalog();

//Assembly範囲で指定

//catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));

//Directory範囲で指定

catalog.Catalogs.Add(

new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));

//コンテナ初期化

var container = new CompositionContainer(catalog);

container.ComposeParts(this);

}

}

var manager = new Manager();

manager.Logger.Write("xxx");