你如何实现通用工厂接口?

时间:2017-11-23 16:17:55

标签: c# .net entity-framework generics

我正在使用DbContextScope。我试图实现这个通用接口:

namespace EntityFramework.DbContextScope.Interfaces {
    public interface IDbContextFactory {
        TDbContext CreateDbContext<TDbContext>() where TDbContext : class, IDbContext;
    }
}

目标是将我的实现提供给以下功能:

namespace EntityFramework.DbContextScope {
    public class DbContextScope : IDbContextScope, IDisposable {
        public DbContextScope(IDbContextFactory dbContextFactory);
    }
}

我似乎无法弄清楚如何实现此接口并正确地将其提供给DbContextScope。我尝试了一个通用的实现:

public class MyDbContextContextFactoryGeneric : IDbContextFactory {
    TDbContext IDbContextFactory.CreateDbContext<TDbContext>() {
        Type type = typeof(TDbContext);
        if (type == typeof(MyDbContext)) {
            return new MyDbContext();
        }
        throw new NotImplementedException();
    }
}

但我得到的错误是:&#34;无法隐式转换类型&#39; MyDBContext&#39; to&#39; TDbContext&#39;&#34;。

我尝试了一个明确的实现:

public class MyDbContextContextFactory : IDbContextFactory<MyDBContext> {
    public MyDBContext Create() {
        return new MyDBContext();
    }
}

但是当我尝试将它传递给DbContextScope时:

public class Test {
    public void PerformTest() {
        IDbContextFactory dbContextFactory = new MyDbContextContextFactory();
        using (DbContextScope scope = new DbContextScope(dbContextFactory)) {
            // Do stuff
        }
    }
}

我在使用行之前的行上出现错误:&#34;无法隐式转换类型&#39; MyDbContextContextFactory&#39; to&#39; EntityFramework.DbContextScope.Interfaces.IDbContextFactory&#39;。存在显式转换(您是否错过了演员?)&#34;

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我终于找到了正确的语法,并且能够使用通用方法解决它。

public class MyDbContextContextFactoryGeneric : IDbContextFactory {
    TDbContext IDbContextFactory.CreateDbContext<TDbContext>() {
        return typeof(TDbContext) == typeof(MyDbContext)
          ? new MyDbContext() as TDbContext
          : Activator.CreateInstance<TDbContext>();
    }
}