Castle Windsor PerWebRequest Lifestyle并未获得荣誉

时间:2012-07-25 06:01:47

标签: c# asp.net asp.net-mvc castle-windsor

我正在开发一个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<>注入城堡windsor来访问实体。自定义提供者/模块根据需要明确.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请求被调用了近十次。

编辑:虽然它没有解释为什么RepositoryMyDataContext没有限定为Web请求的范围,但我在构造函数中的断点显示了一个完全相同的调用堆栈它构建的十几个左右:MembershipProvider.GetUser -> new Repository(IContextFactory)。我没有明确调用GetUser - 世界上有什么会导致FormsAuthentication多次调用GetUser?

1 个答案:

答案 0 :(得分: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#代码。