Linq to SQL&请参阅城堡IoC Container健全检查

时间:2009-10-02 14:43:25

标签: asp.net linq-to-sql inversion-of-control castle-windsor

我刚刚开始使用Linq to SQL和Windsor Castle IoC容器来创建一个新的Web应用程序,虽然在初步测试中似乎工作正常,但我确实可以对它进行健全性检查。

当我尝试在应用程序的不同部分使用Linq将对象从数据库中拉出来然后在数据库中更新它们时,我遇到了问题。由于它们来自不同的数据上下文,我无法保存更改。

所以我在整个应用程序中使用了一个datacontext - 希望基于每个Web请求。 - 这是解决问题的合理方法吗?

看起来像这样:

public class DataContextAccessor : IDataContextAccessor
{
    private readonly DataContext dataContext;
    public DataContextAccessor(string connString)
    {
        dataContext = new DataContext(connString);
    }
    public DataContext DataContext { get { return dataContext; } }
}

我使用Castle来解释这个:

  <component id="DataContextAccessor" service="DomainModel.Repositories.IDataContextAccessor, DomainModel"
                      type="DomainModel.Repositories.DataContextAccessor, DomainModel" lifestyle="PerWebRequest">
  </component>

然后每当我想要进入一个类的数据库时,我只是在构造函数中声明IDataContext datacontext

  • 这是否(我希望)为每个网络请求创建一个数据上下文 - 当许多请求同时进入时,不会给我任何竞争问题?

1 个答案:

答案 0 :(得分:1)

我可以看到你将遇到的问题是你的接口IDataContextAccessor是否公开了DataContext属性:

public interface IDataContextAccessor{
  DataContext DataContext{get;}
}

这个问题在于你实际上已经将你的接口与linq创建的DataContext紧密耦合,这意味着模拟和单元测试几乎是不可能的。