ActionFilterAttribute の Ninject 2 プロパティ インジェクションが機能しない
-
20-09-2019 - |
質問
Ninject 2 によっていくつかのプロパティが挿入されることを期待するメソッド属性がありますが、 userSession
そして jobRepository
null として出てきます:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class JobAttribute : ActionFilterAttribute {
[Inject]
private IUserSession userSession;
[Inject]
private IJobRepository jobRepository;
public override void OnActionExecuting(ActionExecutingContext filterContext) {
var filter = new JobFilter(userSession, jobRepository);
filter.OnActionExecuting(filterContext);
}
}
そして、コントローラー内のメソッドは次のとおりです。
[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
return View(job.Building);
}
コントローラーでコンストラクターインジェクションを使用すると、コントローラーのパラメーターがインジェクションされるため、セットアップが機能していることがわかります。プロパティインジェクションを使用する必要がある属性については、これはあまり役に立ちません。ここで何かが足りないのでしょうか?
Global.asax.cs の関連部分は次のとおりです。
public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication {
protected override void OnApplicationStarted() {
RegisterRoutes(RouteTable.Routes);
RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}
...snip...
protected override IKernel CreateKernel() {
return new StandardKernel(
new RepositoryConfiguration(),
new AuthenticationModule(),
new AutoMapperConfiguration()
);
}
}
public class RepositoryConfiguration : NinjectModule {
public override void Load() {
Bind<ICustomerRepository>().To<CustomerRepository>();
Bind<IJobRepository>().To<JobRepository>();
}
}
public class AuthenticationModule : NinjectModule {
public override void Load() {
Bind<MbdQuote.Core.AppService.IUserSession>().To<UserSession>();
}
}
解決
Ninject2 はフィールドインジェクションを行わず、パブリックセッターを使用してプロパティに変更します。
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Ninject 2 ベータ版より 発表:
Ninject 2にないNINJECT 1.Xにあったもの:
- フィールドインジェクション:Ninject 2の注入は現在、式の木によって駆動され、.NET 3.5には、式ツリーでフィールド値を設定する方法はありません。とにかくこれは悪い習慣なので、私はそれをカットすることにしました。
所属していません StackOverflow