簡體   English   中英

實現通用類型接口的存儲庫返回對象

[英]Repository returning objects implementing interfaces with generic types

我有一個問題要設法解決。 我可能會犯錯,但這是我要嘗試做的事情。

我有兩個界面。 第二接口具有應為第一接口的實現的屬性。 像這樣:

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();

我在哪里做/認為錯誤?

幫助很多applicied :)

編輯:也許存儲庫接口聲明應如下所示

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

和實現:

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

想法? :)

倉庫基本上應該獲取json數據並將其轉換為實體。 但是,從不同的提供者那里可以看到json的不同,但是它包含相同的數據(或多或少)。 我使用Json.NET設置了解析,因此必須在存儲庫返回的實體實現中以不同的方式指定[JsonProperty]

你為什么不擁有:

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

然后有UserFromSourceAUserFromSourceB等。

這樣,您可以將JSON.NET屬性用於不同的實現,同時仍然公開相同的用戶界面。

我已經找到合適的解決方案。 我正在使用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);
        }
    }

如果沒有泛型,這些接口將變得更干凈,更易於閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM