存储库返回实现具有泛型类型的接口的对象

时间:2012-11-14 15:40:53

标签: c# generics interface

我有一个问题,我正试图包裹我。我可能会非常错误,但这就是我想要做的事情。

我有两个接口。第二个接口具有应该是第一个接口的实现的属性。像这样:

public interface ITypeA{
   int Id {get;set;}
}

public interface IEntityA<T>: where T:ITypeA
{
   string Name{get;set;}
   T type{get;set;}
}

实现如下:

public class TypeA: ITypeA{
  int Id {get;set;}
}

public class EntityA: IEntityA<TypeA>{
  public string Name{get;set;}
  public TypeA type{get;set;
}

我可能已经做错了什么(?)。

现在我正在实现存储库模式,其界面如下所示:

public interface IRepo{
   IEnumerable<IEntityA<ITypeA>> GetObjects();
}

和实施:

public class DefaultRepo:Repo{

  //Cunstructors

   public IEnumerable<IEntitytA<ITypeA>> GetObjects(){
      var objects = SomeMethodThatReturnsTheOjects();//Get objects as EntityA[];
      return object.ToList();
   }
}

这不起作用。

我也尝试过施放它,但警告它是一个可疑的演员。

objects.Cast<IEntityA<ITypeA>[]>().ToList();

我在做什么/想错了?

帮助很多appriciated:)

修改 也许存储库接口声明应该如下所示

public interface IRepo<TEntityA> where TEntityA:IEntityA{
       IEnumerable<TEntityA> GetObjects();
    }

和实施:

public class DefaultRepo:Repo<EntityA>{
   ///Methods
}

思考?? :)

2 个答案:

答案 0 :(得分:0)

  

存储库应该基本上获取json数据并将其转换为实体。然而,json可以从不同的提供者看起来非常不同,但它包含相同的数据(或多或少)。我使用Json.NET设置解析,因此必须在存储库返回的实体实现中以不同方式指定[JsonProperty]

你为什么不拥有:

public interface IUserRepository 
{
   IEnumerable<IUser> Find();
}

然后有UserFromSourceAUserFromSourceB

通过这种方式,您可以使用具有不同实现的JSON.NET属性,同时仍然暴露相同的用户界面。

答案 1 :(得分:0)

我找到了一个合适的解决方案。我正在使用json.net,我能够通过这样做来解决它:

public interface ITypeA{
   int Id {get;set;}
}

public interface ITypeB{
   int id {get;set;}
}

public class TypeA:ITypeA
   string Name{get;set;}
   int id {get;set;}

   [JsonConverter(typeof (ConcreteTypeConverter<TypeB>))]
   ITypeB type{get;set;}
}

public class TypeB:ITypeB
{
   int id {get;set;}
}

转换器看起来像这样:

 public class ConcreteTypeConverter<TConcrete> : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            //assume we can convert to anything for now
            return true;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            //explicitly specify the concrete type we want to create
            return serializer.Deserialize<TConcrete>(reader);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            //use the default serialization - it works fine
            serializer.Serialize(writer, value);
        }
    }

在没有泛型的情况下,界面变得更清晰,更容易阅读。