我目前的设置是使用Ninject进行简单的IoC,一切都很顺利,但是我无法在AuthorizeAttribute
内解析我需要的其中一个类。我需要访问一个执行ClaimsVerification的类:
这是我的代码:
IoC配置:
var kernel = new StandardKernel(); // Ninject IoC
// These registrations are "per instance request".
// See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/
kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
.InSingletonScope();
kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>();
kernel.Bind<ISmartDocumentorUow>().To<SmartDocumentorUow>();
kernel.Bind<IClaimsVerification>().To<ClaimsVerification>();
// kernel
//kernel.BindFilter<MyAuthorizeAttribute>(FilterScope.Controller, 0).WhenControllerHas<RequireRolesAttribute>();
// Tell WebApi how to use our Ninject IoC
config.DependencyResolver = new NinjectDependencyResolver(kernel);
MyAuthorizeAttribute:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
[Inject]
IClaimsVerification clamisverify { get; set; }
public MyAuthorizeAttribute()
{
//var x = System.Web.Mvc.DependencyResolver.Current.(typeof(IClaimsVerification));
}
答案 0 :(得分:1)
对不起,问题是注入了无法在web api中运行的iClaimsverification。
我尝试使用公共财产,但仍无效。
bindfilter被注释掉,因为它在核心NInject api(dll)中不存在,它确实存在于ninject的MVC dll中,但它适用于web mvc中的Action过滤器,而不适用于api mvc我可以告诉你......
我确实解决了这个问题,虽然我不喜欢这个问题很多:
private IClaimsVerification verifier
{
get
{
return (GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IClaimsVerification)) as IClaimsVerification);
}
}
答案 1 :(得分:0)
您标有Inject
的属性是私有的 - 您需要使用自定义配置初始化Ninject,以选择进入效率低得多的流程
(你没有在你的问题中陈述问题。我看到你正在尝试BindFilter,但是它被注释掉了(为什么?) - 这是正确的方法。我建议你阅读BindFilter上的Ninject.MVC3 wiki文章作为例子)