【发布时间】:2012-07-25 06:01:46
【问题描述】:
我正在开发一个 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());
我不知道有什么问题——我的测试没有涵盖数据上下文——但在调试模式下,我的数据上下文的构造函数在每个网络请求中被调用了近十几次。
编辑:虽然它没有解释为什么 Repository 和 MyDataContext 没有被限定为 Web 请求,但我在构造函数中的断点显示了一个完全相同的调用堆栈。所以它的构造:MembershipProvider.GetUser -> new Repository(IContextFactory)。我没有明确调用GetUser - 到底是什么导致 FormsAuthentication 调用 GetUser 这么多次?
【问题讨论】:
标签: c# asp.net asp.net-mvc castle-windsor