Конфигурация перехвата Unity - как сделать менее многословным? - PullRequest
2 голосов
/ 26 мая 2011

Чтобы настроить перехват в 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>

Есть ли способ настроить несколько интерфейсов для перехвата с одним и тем жекласс обработки?

Например, что-то вроде этого ...

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

С помощью метода, приведенного в примере с Unity, ваш файл конфигурации становится очень многословным, если у вас много интерфейсов для перехвата.1009 *

1 Ответ

2 голосов
/ 26 мая 2011

Если вы используете сборку Unity.Interception, вы можете выполнять перехваты с атрибутами более свободно. Недостатком этого является то, что перехваченный класс знает (каким-то образом) об аспекте:

Очень быстрый пример установки выглядит следующим образом:

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!");
    }
}
...