Я хочу попробовать протоколирование в стиле SOA с помощью Snap в моем приложении MVC3. Я использую Ninject для IoC, поэтому установил Ninject.MVC и Snap.Ninject через Nuget, и все ознакомились с примером кода в GitHub для Snap.Ninject. Я также читаю Получение SNAP (AOP), NInject и ASP.Net MVC 3, работающих вместе
который, кажется, делает именно то, что я хочу.
Я соответственно обновил свой NinjctMVC3.cs, но когда я добавляю атрибут перехватчика в свой метод, я получаю ошибку ref объекта из Snap AspectUtility. Вот мой NinjectMVC3.cs
public static class NinjectMVC3 {
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start() {
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop() {
bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel() {
//var kernel = new StandardKernel();
NinjectAopConfiguration.NinjectAopConfigure();
var kernel = NinjectAopConfiguration._container.Kernel;
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel) {
kernel.Bind<ILogger>().To<NLogger>()
.WithConstructorArgument("currentClassName", x => x.Request.ParentContext.Request.Service.FullName); ;
kernel.Bind<ISomeDataFactory>().To<SomeDataFactory>();
}
}
public static class NinjectAopConfiguration {
public readonly static NinjectAspectContainer _container;
static NinjectAopConfiguration() {
_container = new NinjectAspectContainer();
}
public static void NinjectAopConfigure() {
SnapConfiguration.For(_container).Configure(c => {
c.IncludeNamespace("TestAopLogging.Model.*");
c.Bind<MyMethodInterceptor>().To<MyInterceptorAttribute>();
});
}
}
public class MyMethodInterceptor : MethodInterceptor {
public override void InterceptMethod(Castle.DynamicProxy.IInvocation invocation, MethodBase method, System.Attribute attribute) {
var logger = new NLogger(method.DeclaringType.ToString());
logger.LogInfo("Hello AOP Logger. Your method (" + method.Name + ") has been intercepted");
invocation.Proceed();
}
public override void BeforeInvocation() {
var logger = new NLogger("How do I work out what class I'm in?");
base.BeforeInvocation();
}
public override void AfterInvocation() {
var logger = new NLogger("How do I work out what class I'm in?");
logger.LogInfo("Hello AOP Logger. After Invocation");
base.AfterInvocation();
}
}
public class MyInterceptorAttribute : MethodInterceptAttribute { }
И контроллер
public class HomeController : Controller
{
private ILogger _logger;
private ISomeDataFactory _someDataFactory;
public HomeController(ILogger logger, ISomeDataFactory someDataFactory) {
_logger = logger;
_someDataFactory = someDataFactory;
}
public ActionResult Index()
{
_logger.LogInfo("I've hit the index action");
_someDataFactory.GetStuffAndLogTheOldWay();
_someDataFactory.GetStuffAndLogUsingAOP();
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
и фабричный класс с методом с атрибутом intercept
public interface ISomeDataFactory {
string GetStuffAndLogTheOldWay();
string GetStuffAndLogUsingAOP();
}
public class SomeDataFactory : ISomeDataFactory {
private ILogger _logger;
public SomeDataFactory(ILogger logger) {
_logger = logger;
}
public string GetStuffAndLogTheOldWay() {
_logger.LogInfo(MethodBase.GetCurrentMethod().Name + " was called");
return "I called GetStuffAndLogTheOldWay";
}
[MyInterceptor] // If I comment this out, then all is good
public string GetStuffAndLogUsingAOP() {
return "I called GetStuffAndLogUsingAOP";
}
}
и это приводит к следующему исключению
[NullReferenceException: ссылка на объект не установлена для экземпляра объекта.]
Snap.AspectUtility.CreateProxy (Тип interfaceType, Object instanceToWrap, IInterceptor [] перехватчики) +29
Snap.AspectUtility.CreatePseudoProxy (прокси-сервер IMasterPro, тип interfaceType, экземпляр объектаToWrap) +184
Snap.Ninject.AspectProxyActivationStrategy.Activate (контекст IContext, ссылка на экземпляр) +376
Ninject.Activation. <> C__DisplayClass2.b__0 (IActivationStrategy s) в c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Activation \ Pipeline.cs: 58
Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map (действие IEnumerable 1 series, Action
1) в c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Infrastructure \ Language \ ExtensionsForIEnumerableOfT.cs: 23
Ninject.Activation.Pipeline.Activate (контекст IContext, ссылка на InstanceReference) в каталоге c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Activation \ Pipeline.cs: 58
Ninject.Activation.Context.Resolve () в c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Activation \ Context.cs: 182
Ninject.KernelBase.b__7 (контекст IContext) в c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ KernelBase.cs: 375
System.Linq. <> C__DisplayClass12 3.<CombineSelectors>b__11(TSource x) +32
System.Linq.WhereSelectEnumerableIterator
2.MoveNext () +151
System.Linq.Enumerable.SingleOrDefault (IEnumerable 1 source) +4178557
Ninject.Planning.Targets.Target
1.GetValue (служба типа, родительский элемент IContext) в каталоге c: \ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Planning \ Targets \ Target.cs: 179
Ninject.Planning.Targets.Target 1.ResolveWithin(IContext parent) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Planning\Targets\Target.cs:147
Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:97
Ninject.Activation.Providers.<>c__DisplayClass2.<Create>b__1(ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81
System.Linq.WhereSelectArrayIterator
2.MoveNext () +85
System.Linq.Buffer 1..ctor(IEnumerable
1 источник) +325
System.Linq.Enumerable.ToArray (IEnumerable 1 source) +78
Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81
Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Context.cs:157
Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\KernelBase.cs:375
System.Linq.<>c__DisplayClass12
3.b__11 (TSource x) +32
System.Linq.WhereSelectEnumerableIterator 2.MoveNext() +151
System.Linq.Enumerable.SingleOrDefault(IEnumerable
1 source) +4178557
Ninject.Web.Mvc.NinjectDependencyResolver.GetService (Тип serviceType) в c: \ Projects \ Ninject \ Maintenance2.2 \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectDependencyResolver.cs: 56
System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Тип controllerType) + 51
Заранее спасибо. Я хочу, чтобы рабочая демоверсия провалилась, и дайте мне знать.