WebAPI和无参数构造函数中的Ninject拦截失败

时间:2015-04-15 23:19:38

标签: asp.net-web-api ninject ninject-interception

我有一个MVC4站点,其中包含MVC和WebAPI。一切顺利,直到我试图改变我的类,以便有一个交叉的AOP类,有助于缓存数据。我现在发现,当我调用一个没有InterceptAttribute的方法时,它会崩溃,因为Ninject没有注入参数,并且它失败了。

我的BLL课程如下:

public class FooBLL
{
    #region Private Variables
       private readonly IDAL _context;
    #endregion
    #region Constructor
        public Foo(IDAL context)
        {
            _context = context;
        }
    #endregion
    #region Public Methods
        public List<Bar> GetAllBars()
        {
            return _context.GetAllBars();
        }
        public List<Bar> GetTwoBars()
        {
            return _context.GetTwoBars();
        }
    #endregion
}

我的WebApi控制器如下所示:

public class FooController : ApiController
{
    #region Private Variables
        private readonly FooBLL _fooBll;
    #endregion
    #region Constructor
        public FooController(FooBLL fooBll)
        {
            _fooBll = fooBll;
        }
    #endregion
    #region Public Methods
        #region Estimate Types
            #region Get
                public List<Bar> GetAllBars()
                {
                    return _fooBll.GetAllBars();
                }
                public List<Bar> GetTwoBars()
                {
                    return _fooBll.GetTwoBars();
                }
            #endregion
        #endregion
    #endregion
}

在我的网站中,我创建了以下用于解析控制器的Ninject类:

public class NinjectRegistrations : NinjectModule
{
        public override void Load()
        {

            Kernel.Bind<IDAL>().To<DAL>().InSingletonScope();
        }
}    
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver, System.Web.Mvc.IDependencyResolver
{
    private readonly IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel)
        : base(kernel)
    {
        this.kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectDependencyScope(this.kernel.BeginBlock());
    }
}
public class NinjectDependencyScope : IDependencyScope
{
    private IResolutionRoot resolver;

    internal NinjectDependencyScope(IResolutionRoot resolver)
    {
        Contract.Assert(resolver != null);

        this.resolver = resolver;
    }

    public void Dispose()
    {
        var disposable = this.resolver as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }

        this.resolver = null;
    }

    public object GetService(Type serviceType)
    {
        if (this.resolver == null)
        {
            throw new ObjectDisposedException("this", "This scope has already been disposed");
        }

        return this.resolver.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        if (this.resolver == null)
        {
            throw new ObjectDisposedException("this", "This scope has already been disposed");
        }

        return this.resolver.GetAll(serviceType);
    }
}

在Global.asax中,我然后注册了这个解析器:

NinjectHelper.Kernel = new StandardKernel(modules);
        var ninjectResolver = new NinjectDependencyResolver(NinjectHelper.Kernel);
DependencyResolver.SetResolver(ninjectResolver); // MVC
GlobalConfiguration.Configuration.DependencyResolver = ninjectResolver; // Web API

//Register Filter Injector
GlobalConfiguration.Configuration.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new NinjectWebApiFilterProvider(NinjectHelper.Kernel));

在我使用Ninject.Extensions.Interception.Attributes.InterceptAttribute添加属性Cache之前,情况一切正常。

该类现在看起来像这样(注意我添加了一个无参数构造函数并将其中一个方法标记为虚拟,这些都是拦截工作所必需的):

public class FooBLL
{
    #region Private Variables
       private readonly IDAL _context;
    #endregion
    #region Constructor
        public Foo(IDAL context)
        {
            _context = context;
        }
        public Foo()
        {
        }
    #endregion
    #region Public Methods
        public List<Bar> GetAllBars()
        {
            return _context.GetAllBars();
        }
        [Cache(DefaultTimeoutMinutes = 20)]
        public virtual List<Bar> GetTwoBars()
        {
            return _context.GetTwoBars();
        }
    #endregion
}

现在在WebAPI控制器上,当我调用GetToBars(具有拦截属性的方法)时,一切仍然正常。

但是,当我调用GetAllBars(没有拦截属性的方法)时,我失败了,_context为null。

非常感谢任何帮助。

0 个答案:

没有答案
相关问题