DI的SQLDependency

时间:2017-05-22 16:29:35

标签: c# entity-framework dependency-injection sqldependency

我想在我的项目中使用SQLDependency和Dependency Injection。这是我的代码

public interface IAreaRepository
{
   string GetAreaQuery();
   List<Area> GetAreas();
}

public class AreaRepository: IAreaRepository
{
    public AreaRepository(DbContext dbContext)
    {
       _dbContext = dbContext;
    }

    public string GetAreaQuery()
    {
       return _dbContext.Areas.ToString();
    }

    public string GetAreas()
    {
       return _dbContext.Areas.ToList();
    }
}

这是我的班级

public class AreaDataProvider
{
    private readonly AreaRepository _areaRepository;
    public AreaDataProvider(IAreaRepository areaRepository)
    {
       _areaRepository = areaRepository;
    }

    public void RegisterForNotification()
    {
        var connectionString = WebConfigurationManager.AppSettings["ConnectionString"];
        using (var connection = new SqlConnection(connectionString))
       {
          var areaQuery = _areaRepository.GetAreaQuery(); // Line 1
          connection.Open();
          using (var oCommand = new SqlCommand(areaQuery, connection))
         {
            // Starting the listener infrastructure...
            SqlDependency.Start(connectionString);

            var oDependency = new SqlDependency(oCommand);
            oDependency.OnChange += OnNotificationChange;

            var reader = oCommand.ExecuteReader();
        }
    }  

    private void OnNotificationChange(object sender, SqlNotificationEventArgs e)
    {
       // Area Table has changed, Get the latest state from Db
       var areas = _areaRepository.GetAreas(); // Line 2
       RegisterForNotification();
    }
}

现在我的问题是如何调用初始化AreaDataProvider,因为如果我使用DBContext传递IAreaRepository,如下所示。

using (AppContext context = new AppContext())
{
   AreaDataProvider provider = new AreaDataProvider(new AreaRepository(context));
   provider.RegisterForNotification();
}

我的DbContext在第1行和第2行中会有所不同。在AreaDataProvider类中实现单个DbContext的最佳方法是什么。

1 个答案:

答案 0 :(得分:1)

  

DbContext在第1行和第2行中会有所不同。

不,不会。它将与传递给构造函数的AreaRepository相同。