Unity The Assembly Matching Rule
11640 ワード
Unityのブロックポリシーには、特定のプログラムセットに属するタイプに対してCallHandlerを追加できるプログラムセットマッチングルールが用意されています.簡単な例を見てみましょう.
AssemblyMatchingRuleのコンストラクション関数では、文字またはAssembly情報を渡すことができます.上記の例では、現在のAppDomainエントリのEntryAssemblyが渡されます.MyObjectタイプはこのAssemblyに属するため、MyCallHandlerとMyCallHandler 2はDoWork関数呼び出し時に順次呼び出されます.上記のコードは、プロファイルで定義することもできます.
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>