首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确构造模型和接口之间的抽象

正确构造模型和接口之间的抽象
EN

Stack Overflow用户
提问于 2016-08-24 09:32:18
回答 1查看 68关注 0票数 1

我不确定这个问题的题目,所以请原谅它是否不正确或误导。

我试图扩展模型和在模型上实现的接口之间的抽象体系结构。我首先演示一个简单的例子,然后我将转到一些需要帮助的方面。

好的,我有一个person接口,它是对应的类模型:

代码语言:javascript
复制
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方法中使用:

代码语言:javascript
复制
public interface IPersonManager
{
    Task<IEnumerable<IPersonModel<CompanyModel>>> GetPersonData();
}

这就引出了我的实际问题。假设模型类更复杂,比如:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
public class PersonModel : IPersonModel<Company, Dog, Car>
{
    public CompanyModel Company { get; set; }
    public DogModel Dog { get; set; }
    public CarModel Car { get; set; }
}

让我们不要忘记Dog模型类:

代码语言:javascript
复制
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方法,如下所示:

代码语言:javascript
复制
public interface IPersonManager
{
    Task<IEnumerable<IPersonModel<CompanyModel, DogModel, CarModel>>> GetPersonData();
}

我想知道是否有更好的方法来做到这一点。如果模型中有嵌套的复杂类型属性,那么它可能会变成一个非常乏味的练习。如果模型具有4个或5个甚至10个复杂类型的属性,那么它将变成相当大的泛型实现。

提前感谢!

简单地说,所有这些麻烦的原因都是为了实现以下架构:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 09:59:41

当我看到一个泛型类型时,我倾向于将它们理解为:这是一个className of Ts:例如,List<int>作为Foos的列表,或者IComparable<Foo>作为ints的IComparable,等等。

你认为一个人是公司的人,还是狗,一个品种的狗?

我要说的是,您的类型系统似乎没有必要在这里使用泛型。简单地使用非神经的方法有什么问题?

代码语言:javascript
复制
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类看起来如下:

代码语言:javascript
复制
public class PersonModel : IPersonModel
{
    public ICompany Company { get; set; }
    public IDog Dog { get; set; }
    public ICar Car { get; set; }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39119487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档