【问题标题】:How do you implement generic factory interface?你如何实现通用工厂接口?
【发布时间】:2017-11-23 16:17:55
【问题描述】:

我正在使用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();
    }
}

但我得到的错误是:“无法将类型 'MyDBContext' 隐式转换为 'TDbContext'”。

我尝试了一个显式的实现:

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
        }
    }
}

我在 using 行之前的行上收到错误:“无法将类型 'MyDbContextContextFactory' 隐式转换为 'EntityFramework.DbContextScope.Interfaces.IDbContextFactory'。存在显式转换(您是否缺少演员表?)”

我做错了什么?

【问题讨论】:

    标签: c# .net entity-framework generics


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多