为T generic创建一个Base类

时间:2015-12-05 23:10:00

标签: c#

我有以下方法:

protected override void OnModelCreating(ModelBuilder builder) {
  builder.Map<Country>();
}

我创建了以下扩展名:

public static class CountryMapper {
  public static void Map<T>(this ModelBuilder builder) where T : Country {
    builder.Entity<T>().HasKey(x => x.Code);
  }
}

这有效,但我希望有一个通用的基类:

public class CountryMapper : EntityMapper<Country> {
   // Here override the map extension ?? 
}

基本上我想像我一样应用Map,但确保所有Mappers都以相同的方式实现。

1 个答案:

答案 0 :(得分:0)

EntityMapper是一个由你制作的课程? 和国家可以修改?

我会添加一个像IEntity这样的接口来公开像

这样的GetKey方法
public interface IEntity {
   object GetKey();
}

然后在国家(以及您需要映射的每个类),实现该界面,例如您的国家/地区可能看起来像

public class Country : IEntity{
   public string Code { get; set; }
   ...
   public object GetKey(){
      return this.Code;
   }
   ...
}

然后你的地图扩展可以是通用的,并且基于这个界面,比如

public static void Map<T>(this ModelBuilder builder) where T : IEntity {
   builder.Entity<T>().HasKey(x => x.GetKey());
}

请注意我写的没有机会进行测试,但这应该指向正确的方向,甚至有一点机会已经有效:)

P.S。 如果您不希望任何人(或使用visual studio时)可以轻松访问该GetKey方法,您可以将其实现为显式接口 应该是

public class Country : IEntity{
   public string Code { get; set; }
   ...
   object IEntity.GetKey(){
      return this.Code;
   }
   ...
}

然后扩展,像

一样
public static void Map<T>(this ModelBuilder builder) where T : IEntity {
   builder.Entity<T>().HasKey(x => ((IEntity)x).GetKey());
}