Замок Виндзор WCF перехватчики - PullRequest
0 голосов
/ 19 января 2012

Мне трудно заставить перехватчики работать в приложении MVC, в котором размещаются службы WCF.

Я хочу добавить детальный контроль над АОП, используя классы / методы, украшенные атрибутами, но перехватчик никогда не вызывается с помощью средства WCF.

В Global.asax У меня есть:

container = new WindsorContainer();
container.AddFacility<WcfFacility>();
container.Kernel.ComponentModelBuilder.AddContributor(new RequireAspects());
container.Install(FromAssembly.This());

RequireAspects подключает перехватчики:

public class RequireAspects : IContributeComponentModelConstruction
{
    if (Attribute.IsDefined(model.Implementation, typeof(CacheAttribute)))
    {
        model.Interceptors.Add(InterceptorReference.ForType(typeof(Caching)));
    }
}

Перехватчик выглядит так:

public class CacheAttribute : Attribute { };

public class Caching : IInterceptor
{
 ...
}

Служба:

[Cache]
public class TestService : ITestService
{
    ...
}

И наконецслужбы установлены:

public class ServicesInstaller : IWindsorInstaller
{
    public void Install(Castle.Windsor.IWindsorContainer container, 
    Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly()
               .InNamespace("Test.Services")
               .Configure((c => c.LifestyleTransient())));
    }
}

Конфигурация служб:

<system.serviceModel>
  <services>
    <service name="Test.Services.TestService">
      <endpoint address=""
                binding="webHttpBinding" 
                contract="Test.Services.ITestService" />
    </service>
  </services>
  <behaviors>
    <endpointBehaviors>
      <behavior name="">
        <enableWebScript />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
       <behavior name="">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
       </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                             multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Перехватчик явно добавлен, и создан прокси, но перехватчик никогда не вызывается.

Я рассмотрел этот рабочий пример перехватчиков с WCF, но не соответствует моему варианту использования.
https://github.com/RussellPolitzky/Castle-Windsor-WCF-Service-With-Interceptor-and-Meta-Data-Publishing

Приведенный выше код работает для всех других случаев, в которых я используюАОП в MVC и библиотеках.

1 Ответ

0 голосов
/ 20 января 2012

Ваш метод обслуживания (не показан), вероятно, не объявлен как виртуальный. Перехватчики могут работать только при разрешении интерфейса или виртуальных членов класса.

...