【发布时间】:2015-07-29 02:02:43
【问题描述】:
我按照Ninject-Wiki 上的教程进行操作 这让我发疯,过滤器内的服务为空,不会更改为对象实例。我尝试了属性注入并用 [Inject] 属性装饰了界面 - 没有结果。 我尝试通过构造函数注入进行注入(如下所示) - 过滤器甚至没有被击中!我想使用这种模式:-(
看在上帝的份上(以及我的理智),请帮我解决这个问题!
最好的问候
我有一个“BaseController”,它作为我所有控制器的中心基类。它用“MyExceptionLog”-Attribute 修饰。
[MyExceptionLog]
public class BaseController : Controller
{
//omitted for brevity
}
“MyExceptionLog”只是一个用于标记控制器的空类。它继承自 FilterAttribute。 我想要注入服务的过滤器如下所示:
public class MyExceptionLogFilter:ActionFilterAttribute
{
private readonly ILogger Logger;
public MyExceptionLogFilter(ILogger logger)
{
Logger = logger;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
Logger.Log(nameof(filterContext.Controller), filterContext.Exception, null);
if (filterContext.Exception.InnerException != null)
{
Logger.Log(nameof(filterContext.Controller), filterContext.Exception.InnerException, null);
}
}
}
}
我使用 customControllerFactory 将服务注入我的控制器:
public class NinjectControllerFactory : DefaultControllerFactory
{
public IKernel kernel;
public NinjectControllerFactory()
{
kernel = new StandardKernel();
AddBindings();
}
private void AddBindings()
{
kernel.Bind<IDbRepository>().To<DbRepository>();
kernel.Bind<ILogger>().To<EntLibLogger>();
kernel.BindFilter<MyExceptionLogFilter>(FilterScope.Action, 0).WhenControllerHas<MyExceptionLogAttribute>();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return controllerType == null
? null
: (IController)kernel.Get(controllerType);
}
}
最后我在 Global.Asax.cs 中注册了 controllerFactory
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
【问题讨论】:
-
不要把你的逻辑放在属性中;将其放入使用属性数据作为输入的适当对象中:stackoverflow.com/a/7194467/126014
-
那么你们俩建议的不是使用属性而是使用 IActionFilter(在我的情况下是 IExceptionFilter),将它连接到 Application_Start 并开心吗?
标签: c# asp.net-mvc dependency-injection ninject ninject.web.mvc