我使用存储库模式使用Ninject配置了MVC 3解决方案。我的一些绑定包括:
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope();
kernel.Bind<IMyService>().To<MyService>().InRequestScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();
我还在我的解决方案中添加了一个控制台应用程序,我希望利用相同的存储库和服务。我的控制台应用程序的Ninject配置如下所示:
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope();
kernel.Bind<IMyService>().To<MyService>().InSingletonScope();
kernel.Bind<ILogging>().To<Logging>().InSingletonScope();
我的控制台代码如下:
static void Main(string[] args)
{
IKernel kernel = new StandardKernel(new IoCMapper());
var service = kernel.Get<IMyService>();
var logger = kernel.Get<ILogging>();
... do some processing here
}
这很好用,但我想确保我正在为控制台应用程序正确配置Ninject。在我的控制台应用程序中对我的所有绑定使用InSingletonScope()是否正确?我应该采用不同的方式进行配置吗?
答案 0 :(得分:11)
您是否希望整个应用程序中每个存储库服务只有一个实例?如果是这样,那么使用InSingletonScope。
您的控制台应用程序是多线程的吗?如果是这种情况,并且您希望每个线程都有一个新的服务实例,那么您将使用InThreadScope。
如果您希望每次调用服务的新实例,请将其设置为InTransientScope。
您还可以选择使用InScope定义自己的范围。 Bob Cravens在这里http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/
给出了很好的概述