7

Ninject 2によっていくつかのプロパティが注入されることを期待するメソッド属性がありますがuserSessionjobRepositorynullとして表示されます。

[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>();
    }
}
4

1 に答える 1

13

Ninject2はフィールドインジェクションを行わないため、パブリックセッターを使用してプロパティに変更します。

class JobAttribute : ActionFilterAttribute {
    [Inject]
    public IUserSession UserSession
    { set; private get; }

    [Inject]
    public IJobRepository JobRepository
    { set; private get; }
}

Ninject 2 Betaの発表から:

Ninject 1.xにあったもので、Ninject2にはないもの。

  • フィールドインジェクション:Ninject 2のインジェクションは、式ツリーによって駆動されるようになりました。.NET3.5では、式ツリーを使用してフィールド値を設定する方法はありません。とにかくこれは悪い習慣なので、私はそれをカットすることにしました。
于 2010-02-15T23:12:21.350 に答える