我不确定这个问题的题目,所以请原谅它是否不正确或误导。
我试图扩展模型和在模型上实现的接口之间的抽象体系结构。我首先演示一个简单的例子,然后我将转到一些需要帮助的方面。
好的,我有一个person接口,它是对应的类模型:
public interface IPersonModel<T>
where T : ICompany
{
T Company { get; set; }
}
public class PersonModel : IPersonModel<Company>
{
public CompanyModel Company { get; set; }
}
public class CompanyModel : ICompany
{
public string Name { get; set; }
}因此,如果模型类只有一个属性(这是一个复杂的类型),那么上面的代码工作得很好。因此,可以很容易地在Manager方法中使用:
public interface IPersonManager
{
Task<IEnumerable<IPersonModel<CompanyModel>>> GetPersonData();
}这就引出了我的实际问题。假设模型类更复杂,比如:
public interface IPersonModel<T, T2, T3>
where T : ICompany
where T2 : IDog<BreedModel>
where T3 : ICar
{
T Company { get; set; }
T2 Dog { get; set; }
T3 Car { get; set; }
}这将导致更新PersonModel类:
public class PersonModel : IPersonModel<Company, Dog, Car>
{
public CompanyModel Company { get; set; }
public DogModel Dog { get; set; }
public CarModel Car { get; set; }
}让我们不要忘记Dog模型类:
public class DogModel : IDog<BreedModel>
{
public string Name { get; set; }
public BreedModel Breed { get; set; }
}
public class BreedModel : IBreed
{
public string Attributes { get; set; }
public void GetBreedData()
{
// ...
}
}这将导致使用manager方法,如下所示:
public interface IPersonManager
{
Task<IEnumerable<IPersonModel<CompanyModel, DogModel, CarModel>>> GetPersonData();
}我想知道是否有更好的方法来做到这一点。如果模型中有嵌套的复杂类型属性,那么它可能会变成一个非常乏味的练习。如果模型具有4个或5个甚至10个复杂类型的属性,那么它将变成相当大的泛型实现。
提前感谢!
简单地说,所有这些麻烦的原因都是为了实现以下架构:

发布于 2016-08-24 09:59:41
当我看到一个泛型类型时,我倾向于将它们理解为:这是一个className of Ts:例如,List<int>作为Foos的列表,或者IComparable<Foo>作为ints的IComparable,等等。
你认为一个人是公司的人,还是狗,一个品种的狗?
我要说的是,您的类型系统似乎没有必要在这里使用泛型。简单地使用非神经的方法有什么问题?
public interface IPersonModel
{
ICompany Company { get; set; }
IDog Dog { get; set; }
ICar Car { get; set; }
}
public class DogModel: IDog
{
public string Name { get; set; }
public IBreed Breed { get; set; }
}
public class BreedModel : IBreed
{
public string Attributes { get; set; }
public void GetBreedData()
{
// ...
}
}
public interface IPersonManager
{
Task<IEnumerable<IPersonModel> GetPersonData();
}现在,您的具体PersonModel类看起来如下:
public class PersonModel : IPersonModel
{
public ICompany Company { get; set; }
public IDog Dog { get; set; }
public ICar Car { get; set; }
}https://stackoverflow.com/questions/39119487
复制相似问题