Что вам нужно сделать, так это воспользоваться преимуществом конвейера перехвата Unity.
Unity предоставляет встроенное поведение внедрения политики, облегчающее реализацию aop.Поведение внедрения политики добавляет или внедряет некоторые функции в конкретные методы, используя обработчики вызовов и правила сопоставления для каждого метода.
a.Начните с пользовательского интерфейса ICallhandler.
>> public interface ILogAttributeHandler : ICallHandler
>> {
>> }
>>
b.Добавьте свою реализацию для вашего обработчика.Это совет, который вы хотите применить, когда ваш метод перехватывается.
>> public class ActivityAttributeHandler : ILogAttributeHandler
>> {
>> public ActivityAttributeHandler(string activityType)
>> {
>> ActivityType = activityType;
>> }
>> private string ActivityType { get; set; }
>> public int Order { get; set; }
>> public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
>> {
>> //// Invoke the handler
>> IMethodReturn output = getNext()(input, getNext);
>> //// Perform post-processing task
>> var agent = output.ReturnValue as Agent;
>> if (agent != null)
>> {
>> //// do work here
>> }
>> return getNext()(input, getNext);
>> }
}
c.Создайте свой пользовательский атрибут, он будет использоваться как точка в программе.
>> [AttributeUsage(AttributeTargets.Method)]
>> public class ActivityAttribute : HandlerAttribute
>> {
>> private readonly string _activityName;
>> public ActivityAttribute(string activityName)
>> {
>> _activityName = activityName;
>> }
>> }
>> public override ICallHandler CreateHandler(IUnityContainer container)
>> {
>> return null;
>>}
d.Теперь все, что у вас осталось, - это настроить перехват в вашей конфигурации Unity и добавить к операции интерфейса вашего сервиса атрибут, который вы хотите перехватить.
> container
> .RegisterType<ILogAttributeHandler, LogAttributeHandler>()
> .AddNewExtension<Interception>()
> .Configure<Interception>()
> .SetInterceptorFor<ISecurityRepository>("SecurityRepository", new
> InterfaceInterceptor());
e.Применить атрибуты к операциям интерфейса
>>public interface ISecurityRepository
>> {
>> [OperationContract(IsInitiating = true)]
>> [Activity("Logon")]
>> IList<vNavigationTree> GetNavigationTree(string ticket)
>>}