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");