2

要設置攔截在Unity 2.0你把這樣的事情在你的配置(從Unity資料爲準)...統一攔截配置 - 如何減少冗長?

 <policy name="addDataAccessTypes"> 
     <matchingRule name="DataLayerMatch" type="NamespaceMatchingRule"> 
      <constructor> 
      <param name="namespaceName" value="MyApp.DataAccess" /> 
      </constructor> 
     </matchingRule> 
     <callHandler name="LogHandler" type="LoggingCallHandler" /> 
     <callHandler name="SecurityHandler" 
      type="DatabaseSecurityCheckHandler" /> 
     </policy> 

有沒有辦法來設立inteception多個接口使用相同的處理類?

例如這樣的事情...

<constructor> 
    < interface to intercept 1 /> 
    < interface to intercept 2 /> 
</construtor> 

隨着統一例子給出的方法,如果你有很多的接口攔截您的配置文件變得非常冗長。

回答

2

如果您使用Unity.Interception組件,則可以以更流暢的方式使用屬性進行截取。這樣做的缺點是攔截類做(在某種程度上)瞭解方面:

A中的設置非常簡單的例子是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Console.WriteLine(); 
      Console.WriteLine("Starting test..."); 

      var container = new UnityContainer(); 
      container.AddNewExtension<Interception>(); 
      container.Configure<Interception>() 
       .SetDefaultInterceptorFor<IGadget>(new InterfaceInterceptor()); 

      container.RegisterType<IGadget, Gadget>(); 

      var gadget = container.Resolve<IGadget>(); 
      gadget.DoSomething(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(); 
      Console.WriteLine("An error has occurred: {0}", ex); 
     } 
     finally 
     { 
      Console.WriteLine(); 
      Console.WriteLine("Test complete."); 
      Console.ReadKey(); 
     } 
    } 
} 



public class LogAttribute : HandlerAttribute 
{ 
    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return container.Resolve<LogHandler>(); 
    } 
} 

public class LogHandler : ICallHandler 
{ 
    public int Order { get; set; } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     Console.WriteLine("*** Logging the action! -{0}-", input.MethodBase.Name); 
     return getNext()(input, getNext); 
    } 
} 

public interface IGadget 
{ 
    void DoSomething(); 
} 

[Log] 
public class Gadget : IGadget 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("\tI did something!"); 
    } 
} 
+0

好主意,但需要做的是在配置。 – Remotec 2011-05-27 06:39:15

+0

我不確定你在說什麼。你的意思是你被限制在配置中出於某種原因嗎?我提供我的解決方案作爲必須在配置文件中執行任何設置的替代方案。 – cloggins 2011-05-27 23:50:29