2012-02-15 4 views
2

У меня есть сервисная библиотека wcf, размещенная в службе Windows. Мне нужно перехватить вызовы на Способы обслуживания. В этом случае предполагается зарегистрировать WCF в контейнер Unity, как можно видеть в этой ссылкеРегистрация службы WCF в контейнере Unity

http://weblogs.asp.net/fabio/archive/2009/03/24/inversion-of-control-with-wcf-and-unity.aspx

Я пытаюсь реализовать подобный подход, Unity.WCF сборки из Codeplex.I не мог понять, куда поместите мою конфигурацию контейнера или загрузчик в библиотеку сервиса wcf (или службу Windows). Не существует твердого образца (vs solution).

My Windows Service Хост

частный UnityServiceHost _serviceHost = NULL; приватный readonly UnityContainer _container;

public Service() { 
     InitializeComponent(); 
     _container = new UnityContainer(); 
     _container.AddNewExtension<Interception>(); 
     _container.RegisterType<ISecurityRepository, SecurityRepository>(); 
     _container.Configure<Interception>().SetDefaultInterceptorFor<ISecurityRepository>(new TransparentProxyInterceptor()); 
    } 

    protected override void OnStart(string[] args) { 

     //SecurityService 
     if (_serviceHost != null) { 

      _serviceHost.Close(); 
     } else { 
      _serviceHost = new UnityServiceHost(_container, typeof(SecurityRepository)); 
      _serviceHost.Open(); 
     } 

    } 

    protected override void OnStop() { 

     //SecurityService 
     if (_serviceHost != null) { 

      _serviceHost.Close(); 
      _serviceHost = null; 
     } 
    } 

Моя_служба Договор

[ServiceContract (SessionMode = SessionMode.Required)] общедоступный интерфейс ISecurityRepository {

[OperationContract(IsInitiating = true)] 
    IList<vNavigationTree> GetNavigationTree(string ticket); 

    [OperationContract(IsInitiating = true)] 
    string GetSessionGuid(string userName, string IP, string machineName); 
} 

В этом случае, кажется, что перехватчик не work.Briefly что Мне нужен пример проекта, в котором служба WCF зарегистрирована в контейнере DI, и методы обслуживания перехватываются.

ответ

2

Я попытаюсь объяснить, что я попытался сделать более явно и как мне удалось это сделать. У меня есть приложение WPF, связанное с базой данных через WCF, что означает, что мое приложение разделено примерно на две части: на стороне клиента и на стороне сервера (WCF). Я завернул клиентскую сторону в контейнер Unity через UnityBootStrapper, предоставленный PRISM. Мне нужно также обернуть серверную часть в другой контейнер Unity, чтобы Unity разрешила зависимости на стороне сервера.

Моя проблема решена Unity.WCF (доступен как пакет Nuget), который предоставляет класс UnityServiceHost, который можно использовать вместо ServiceHost. Я предполагаю, что этот пакет создан в том, как этот пост объясняет:

http://weblogs.asp.net/fabio/archive/2009/03/24/inversion-of-control-with-wcf-and-unity.aspx

1

Что вам нужно сделать, это воспользоваться единством перехвата трубопровода.

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. Создайте свой собственный атрибут, который будет использоваться как pointcut в программе.

>> [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. Теперь все, что у вас осталось, - настроить перехват в вашей конфигурации единства и добавить атрибут к операции вашего интерфейса службы, которую вы хотите перехватить.

> 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) 
>>} 
Смежные вопросы