私のソリューションには、ドメイン プロジェクトと MVC3 Web プロジェクト (例: MyApp.Domain と MyApp.Web) の 2 つのプロジェクトがあります。以前は、Ninject.Extensions.Conventions ver. 2. NinjectMVC3.cs ファイルで次のステートメントを使用でき、ソリューション全体 (Web とドメインの両方) に必要な依存関係が適切に挿入されました (たとえば、IFoo は自動的に Foo にバインドされました)。
kernel.Scan(x =>
{
x.FromAssembliesMatching("*");
x.BindWith<DefaultBindingGenerator>();
});
Ninject 3.0.0 (プレリリース) と Ninject.Extensions.Conventions 3.0.0 (別のプレリリース) にアップグレードしましたが、規約ベースのバインディングの構文が変更されました。新しいバージョンで次のステートメントを使用できることがわかりましたが、MyApp.Domain ではなく、MyApp.Web の規則ベースのインターフェイスのみを自動的にバインドします。以前のバージョンでは、アプリケーション全体でインターフェイスがバインドされていました。
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.BindToAllInterfaces());
新しい Ninject バージョンで規則ベースのバインディングを構成する方法の手がかりはありますか? アセンブリの指定に関係していると思いますが、使用FromAssembliesMatching("*")
してみましたが、すべて失敗します。
-- RegisterServices メソッドで既存のコードを表示するように編集します。 --
private static void RegisterServices(IKernel kernel)
{
// This code used to work with v.2 of Ninject.Extensions.Conventions
// kernel.Scan(x =>
// {
// x.FromAssembliesMatching("*");
// x.BindWith<DefaultBindingGenerator>();
// });
// This is the new v3 code that automatically injects dependencies but only for interfaces in MyApp.Web, not MyApp.Domain
kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().BindToAllInterfaces());
// I tried this code, but it throws "Error activating IDependencyResolver" at "bootstrapper.Initialize(CreateKernel)"
// kernel.Bind(x => x.FromAssembliesInPath(AppDomain.CurrentDomain.RelativeSearchPath).SelectAllClasses().BindToAllInterfaces());
// These are dependencies in MyApp.Web that ARE being bound properly by the current configuration
// kernel.Bind<IMemberQueries>().To<MemberQueries>();
// kernel.Bind<IGrantApplicationQueries>().To<GrantApplicationQueries>();
// kernel.Bind<IMailController>().To<MailController>();
// These are dependencies in MyApp.Domain that ARE NOT being bound properly by the current configuration, so I have to declare them manually
// They used to be injected automatically with version 2 of the conventions extention
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
kernel.Bind<IMemberServices>().To<MemberServices>();
kernel.Bind<IGrantApplicationServices>().To<GrantApplicationServices>();
// These are dependencies that SHOULD NOT be bound by convention as they require a different scope or have unique naming
kernel.Bind(typeof(EfDbContext)).ToSelf().InRequestScope();
kernel.Bind<IConfigurationProvider>().To<WebConfigConfigurationProvider>().InSingletonScope();
kernel.Bind<IAuthorizationProvider>().To<MyAppAuthorizationProvider>();
kernel.Bind<IPrincipal>().ToMethod(ctx => HttpContext.Current.User).InRequestScope();
kernel.Bind<IGrantApplicationDocumentServices>().To<MySpecialNameGrantAplicationDocumentServices>().InRequestScope();
}