我有一个问题,我正试图包裹我。我可能会非常错误,但这就是我想要做的事情。
我有两个接口。第二个接口具有应该是第一个接口的实现的属性。像这样:
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
}
思考?? :)
答案 0 :(得分:0)
存储库应该基本上获取json数据并将其转换为实体。然而,json可以从不同的提供者看起来非常不同,但它包含相同的数据(或多或少)。我使用Json.NET设置解析,因此必须在存储库返回的实体实现中以不同方式指定[JsonProperty]
你为什么不拥有:
public interface IUserRepository
{
IEnumerable<IUser> Find();
}
然后有UserFromSourceA
,UserFromSourceB
等
通过这种方式,您可以使用具有不同实现的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);
}
}
在没有泛型的情况下,界面变得更清晰,更容易阅读。