【发布时间】:2014-01-22 12:19:07
【问题描述】:
我创建了一个示例项目来模拟我在实际项目中遇到的问题。 问题是,当我在一个循环中查询一些外部数据时(在现实生活中,我的项目会查询窗口以查找匹配项,并在成功或超时到期时停止查询)。在我看来,NInject 并没有处理创建的对象,而是将循环视为一个长时间的调用。 如何解决这种情况?也许,剪下填充列表的代码并将其放入另一个类?或者简单地说,你能让我的示例项目变得更好吗?
The link on Github或其代码如下:
public interface IMyObj : IDisposable
{
string Name { get; set; }
}
public class MyObj : IMyObj
{
public virtual string Name { get; set; }
public virtual void Dispose()
{
Name = string.Empty;
GC.SuppressFinalize(this);
}
}
public class NjModule : NinjectModule
{
public override void Load()
{
Bind<IMyObj>()
.To<MyObj>()
.InCallScope();
Bind<Requester>()
.ToSelf()
.InSingletonScope();
}
}
public class Requester
{
public List<IMyObj> RequestObjects()
{
List<IMyObj> list = new List<IMyObj>();
for(int i = 0; i < 10; i++) {
var myObj = Program.Kernel.Get<IMyObj>();
myObj.Name = "abcdefghijklmnopqrstuvwxyz";
list.Add(myObj);
}
return list;
}
}
class Program
{
public static IKernel Kernel;
public static void Main(string[] args)
{
Console.WriteLine("Hello NInject!");
// TODO: Implement Functionality Here
Kernel = new StandardKernel(new NjModule());
Kernel.Settings.ActivationCacheDisabled = true;
var requester = Kernel.Get<Requester>();
for (int i = 0; i < 100000000; i++) {
List<IMyObj> list =
requester.RequestObjects();
foreach (MyObj listItem in list) {
listItem.Dispose();
}
list.Clear();
list = null;
}
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
【问题讨论】:
标签: c# memory scope c#-3.0 ninject