まずサンプル用にコンソールアプリを作成してから以下のクラスを追加していきます。
【SampleExtension.cs】
using Microsoft.Practices.Unity;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection.ObjectBuilder;
using Microsoft.Practices.Unity.ObjectBuilder;
namespace EntLib4Study
{
public class SampleExtension : UnityContainerExtension
{
public new ExtensionContext Context
{
get { return base.Context; }
}
protected override void Initialize()
{
this.Context.Strategies.AddNew<PolicyInjectionStrategy>(UnityBuildStage.PreCreation);
this.Context.Policies.SetDefault<IPolicyInjectionPolicy>(new PolicyInjectionPolicy(true));
}
}
}
【SampleCallHandler.cs】
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
namespace EntLib4Study
{
public class SampleCallHandler : ICallHandler
{
private int order = 0;
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("前処理実行!");
input.MethodBase.Invoke(input.Target, null);
Console.WriteLine("後処理実行!");
return input.CreateMethodReturn(null, input.Arguments);
}
public int Order
{
get { return order; }
set { order = value; }
}
}
}
【SampleCallHandlerAttribute】
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
namespace EntLib4Study
{
public class SampleCallHandlerAttribute : HandlerAttribute
{
public SampleCallHandlerAttribute()
{
}
public override ICallHandler CreateHandler()
{
return new SampleCallHandler();
}
}
}
ここまで追加できたら、あとは呼び出しコードを記述して実行するだけです。
class Program
{
static void Main(string[] args)
{
IUnityContainer myContainer = new UnityContainer();
myContainer.AddExtension(new SampleExtension());
myContainer.RegisterType<ILog, Log1>();
ILog logger = myContainer.Resolve<ILog>();
logger.Output();
Console.ReadLine();
}
}
public interface ILog
{
void Output();
}
public class Log1 : ILog
{
[SampleCallHandler]
public void Output()
{
Console.WriteLine("サンプル出力1");
}
}
実行すると、※古いMTはpreやcodeだと極小フォントになるので見づらいですが、コピペして適当なエディタにはって頂ければ見やすいかと(^^;
Posted by GAMMARAY at 2008年08月05日 15:21
| TrackBack