1

我正在开发一个 3 层 MVC 应用程序。数据层包含一个 EF4 代码优先的 DbContext:

public class MyDataContext : DbContext
{
    // DbSet<>s...
}

DI 还有一个接口和一个实现:

public interface IContextFactory
{
    MyDataContext GetContext();
}

public class ContextFactory : IContextFactory
{
    readonly MyDataContext context;
    public ContextFactory(MyDataContext context)
    {
        this.context = context;
    }

    public MyDataContext GetContext()
    {
        return this.context;
    }
}

还有一个存储库模式:

public interface IRepository<T>
{
    T Create();
    void Insert(T entity);
    void Delete(T entity);
    ...
    void Save();
}

public class Repository<TEntity> : IRepository<TEntity>
  where TEntity: class, new()
{
    public Repository(IContextFactory factory)
    {
        this.context = factory.GetContext();
        this.set = factory.Set<TEntity>();
    }
    ...
}

上层通过IRepository<>注入城堡温莎来访问实体。自定义提供程序/模块.Resolve<>()根据需要明确地显示它们。

数据层正在城堡中注册IWindsorInstaller

container.Register(
    Component.For<MyDataContext>()
    .DependsOn(new Hashtable() { {"connectionStringName", "DefaultConnection"} })
    .LifestylePerWebRequest());

container.Register(
    Component.For<IContextFactory>()
    .ImplementedBy<ContextFactory>()
    .LifestylePerWebRequest());

container.Register(
     Component.For(typeof(IRepository<>))
    .ImplementedBy(typeof(Repository<>))
    .LifestylePerWebRequest());

我不知道有什么问题——我的测试没有涵盖数据上下文——但是在调试模式下,我的数据上下文的构造函数在每个 Web 请求中被调用了近十几次。

编辑:虽然它没有解释为什么Repository并且MyDataContext没有将范围限定为 Web 请求,但我在构造函数中的断点显示了一个相同的调用堆栈,它构造的所有十多次:MembershipProvider.GetUser -> new Repository(IContextFactory)。我没有明确的调用GetUser——到底是什么导致 FormsAuthentication 调用 GetUser 这么多次?

4

1 回答 1

2

在 Global.asax.cs 文件中添加类似的内容:

    protected void Application_BeginRequest(object sender, EventArgs args)
    {
        System.Diagnostics.Debug.WriteLine(this.Request.RequestType + " " + this.Request.RawUrl);
    }

连接调试器并验证每个“请求”确实只有一个请求。也许您有并行运行的 ajax 请求。或者,也许您的内容元素(js 文件、图像)受到保护,并且它们正在执行 C# 代码。

于 2012-07-25T07:13:04.967 回答