具有“匹配”通用接口的C#通用类的定义

时间:2017-05-15 15:52:15

标签: c# entity-framework generics

我正在尝试为ASP.NET Core(MVC6)应用程序中的DbContext(EF6)声明一个泛型类(Factory)。问题是我需要一个依赖注入的接口类型。

我尝试了多种方法,谷歌(一反常态)似乎没有帮助。这或者意味着我的搜索使用了错误的单词,或者我正在尝试做的是完全错误的。

所以问题是:

如果我在一个项目中有两个DbContexts,并且我想创建一个通用工厂,它可以使用单个方法(称为CreateContext())为这些中的任何一个创建上下文,并使用通用接口,因此我可以使用依赖注入,请问正确的课程定义是什么?

示例界面:

public interface IDbContext<C> where C: DbContext
{
    C CreateContext(); //<-- generic bit required here for this method
}

示例工厂:

public class DbContextFactory<C> : IDbContext<C>, where C: DbContext //<--unable to get this correct
{
    private C _context = null;
    private string _connectionstring;

    public DbContextFactory(string connectionString)
    {
        _connectionString = connectionString;
    }    

    public C CreateContext()
    {
       try
       {
          var optionsBuilder = new DbContextOptionsBuilder<C>();
          optionsBuilder.UseSqlServer(_connectionString);
          //_context = new C(optionsBuilder.Options); //<-- issue here also
          _context = default(C); //<-- how to pass options??
       }
       catch (Exception ex)
       {
         // log some error here
       }
       return _context;
    }
}

非常感谢有关此主题的任何帮助。 :)

1 个答案:

答案 0 :(得分:0)

正如所说,正确的定义是:

接口保持不变......

public class DbContextFactory<C> : IDbContext<C> where C: DbContext
{
  ...
}

public C CreateContext() ...

这可以按预期工作。