我正在开发一个 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 这么多次?