我一直在阅读很多文章,解释如何设置实体框架,DbContext以便每个HTTP Web请求只使用各种DI框架创建和使用一个.
为什么这首先是一个好主意?使用这种方法有什么好处?在某些情况下这是个好主意吗?在使用DbContext存储库方法调用实例化s 时,您是否可以使用此技术执行某些操作?
在我的MVC3项目中,我已经在InRequestScope的基础上将我的内核设置为Ninject Entityframework上下文,这非常有效,但是我有一个后台运行器来执行一些工作流管理.
它每5分钟启动一个新线程,我将我的依赖项Ninject到这个线程中,如果我将范围更改为InThreadScipe,则会触发Dispose方法,但如果我将其更改回InRequestScope,则Dispose方法不会触发.
如果InRequestScope不可用,是否有退回InThreadScope的方法?
更新:刚刚得到一个关于这个问题的upvote,为什么不用一些额外的信息更新它.我认为Ninjects处理生命时间的方式有点过时了.其他IoC的子容器是Transient注册的对象,它们存放在整个子容器中,并在子容器处理时被丢弃.这是一种更简单的方法,例如Web API与上述方案之类的自定义工作程序相结合.
当 ninject 内的弱引用集合中没有对象被释放时,内存泄漏,我做错了什么或者 ninject 中是否存在巨大错误?
当 Kernal 被释放时,弱引用集合中的所有引用都会被释放,但是在这个循环中,即使没有来自代码的引用 - 内存也会爆炸。
public class Program
{
private StandardKernel kernel;
private static void Main(string[] args)
{
new Program().Run();
}
public void Run()
{
kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = false });
kernel.Bind<Root>().ToSelf();
kernel.Bind<Foo>().ToSelf().InCallScope();
while (true)
{
Process();
Thread.Sleep(500);
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
public void Process()
{
Root root = kernel.Get<Root>();
Root root2 = kernel.Get<Root>();
}
public class Root
{
private Foo _test;
public Root(Foo foofac)
{
Id = Guid.NewGuid();
_test = …Run Code Online (Sandbox Code Playgroud)