Unity The Assembly Matching Rule

11640 ワード

Unityのブロックポリシーには、特定のプログラムセットに属するタイプに対してCallHandlerを追加できるプログラムセットマッチングルールが用意されています.簡単な例を見てみましょう.
 1 public class MyObject
 2 {
 3   public virtual void DoWork()
 4   {
 5 
 6   }
 7 }
 8 
 9 public class MyCallHandler : ICallHandler
10 {
11   #region ICallHandler Members
12 
13   public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
14   {
15     return getNext()(input, getNext);
16   }
17 
18   public Int32 Order { get; set; }
19 
20   #endregion
21 }
22 
23 public class MyCallHandler2 : ICallHandler
24 {
25   #region ICallHandler Members
26 
27   public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
28   {
29     return getNext()(input, getNext);
30   }
31 
32   public Int32 Order { get; set; }
33 
34   #endregion
35 }
36 
37 IUnityContainer unityContainer = new UnityContainer();
38 
39 unityContainer.LoadConfiguration();
40 unityContainer.Configure<Interception>()
41   .AddPolicy(“AssemblyPolicy”)
42   .AddMatchingRule(new AssemblyMatchingRule(Assembly.GetEntryAssembly()))
43   .AddCallHandler<MyCallHandler>()
44   .AddCallHandler<MyCallHandler2>();
45 
46 unityContainer.RegisterType<MyObject>(
47   new Interceptor<VirtualMethodInterceptor>(),
48   new AdditionalInterface<INotifyPropertyChanged>(),
49   new InterceptionBehavior<PolicyInjectionBehavior>()
50 );
51 
52 MyObject myObject = unityContainer.Resolve<MyObject>();
53 
54 myObject.DoWork();

AssemblyMatchingRuleのコンストラクション関数では、文字またはAssembly情報を渡すことができます.上記の例では、現在のAppDomainエントリのEntryAssemblyが渡されます.MyObjectタイプはこのAssemblyに属するため、MyCallHandlerとMyCallHandler 2はDoWork関数呼び出し時に順次呼び出されます.上記のコードは、プロファイルで定義することもできます.
<unity xmlns=”http://schemas.microsoft.com/practices/2010/unity”>
  <sectionExtension type=”Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration” />

  <assembly name=”mscorlib, 2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″ />
  <assembly name=”UnityTest6″ />

  <namespace name=”System.ComponentModel” />
  <namespace name=”UnityTest6″ />

  <container>
    <extension type=”Interception” />

    <interception>
      <policy name=”AssemblyPolicy”>
        <matchingRule name=”AssemblyMatchingRule” type=”AssemblyMatchingRule”>
          <constructor>
            <param name=”assemblyName” value=”UnityTest6″ />
          </constructor>
        </matchingRule>
        <callHandler name=”MyCallHandler” type=”MyCallHandler” />
      </policy>
    </interception>

    <register type=”MyObject”>
      <interceptor type=”VirtualMethodInterceptor” />
      <addInterface type=”INotifyPropertyChanged” />
      <interceptionBehavior type=”PolicyInjectionBehavior” />
    </register>
  </container>
</unity>