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