2017-02-27 28 views
1

(抱歉,如果标题是不恰当的,不知道如何正确字的问题)OOP基础 - C#重构?

一个User(人)拥有Property(一所房子,街道地址等)。

我正在重构一个项目,并且有以下情况。我有一个名为Property的课程和一个名为User的课程。

业务规则:用户具有一个或多个属性。

那么,什么更有意义:

User.GetProperties()

Properties.Get(userId)

目前我通过User访问类的属性。不知道这是否是处理这种关系的常用方式。你们是怎么想的?

我想在这里向前和关注的原因是因为我稍后会:

Property.Get(state)

Property.Get(zip)

Property.Get(city)

Property.Get(numberOfBedroom)

等。 。

其他获取房产的方法和我知道这些将通过Property类访问。对? (我对此坚定不移),这是否改变了如何访问用户的属性

更新

我不问如何正确地创建的类,就像我说我有两个班。我的问题,更好地说,就是:

使我的网页API,对于给定的情景(User有一个或多个Property [IES):

/api/user/properties/{userId} // get all user properties

api/property/user/{userId} // get all user properties

因为我明确将实施:

api/property/zip/{zipCode} // get all properties by zip

api/property/state/{state} // get all properties by state

api/property/city/{city} // get all properties by city

因此,考虑到过去的3个例子,你会

(一)实施/api/user/properties/{userId}同时实现所有api/property/...为后来3箱子

(b)保持一致并从api/property/user/...的角度查询UserProperty [ies]?

然后,回答这个问题后,我仍然有User类与GetProperties()方法返回List<Property>

我可以有Property类与GetByUser(int userId)方法返回List<Property>

因为在现实世界中User有1个或更多Property而不是相反。所以我们的基本OOP本能就是对它进行建模,但是当考虑WebApi和一个可能公开暴露的API时,我认为后者是首选,但是从C#(服务器端)获取UserPropert是什么使得但我的前端开发人员(jQuery,Angular,JavaScript等)需要流畅的API,api/property/user/...可能是合乎逻辑的,我可能不认为要看api/user/propties/...(或我可能)...

那么,您将使用哪种API方法以及为什么,以及您将使用哪种类模型以及为什么。

谢谢。

更新2

(心里对自己说)“答案可能是既”创建API的OOP正确性和api/property/user/...两种方式api/user/properties/...了一口流利的API,并有两个调用同一个类的方法?对?

+0

有用的参考看来你的业务规则较为复杂:有属性描述符的列表,用户可以拥有这些描述符的一个或多个属性值。这是真的吗? –

+1

关闭袖口猜测 - 与跟踪/识别用户相比,您对追踪/识别属性更感兴趣。在我看来,你的API应该是关于属性,以及获取你关心的属性集合的各种方法,而不是关于用户,ZIP或状态。总之,我认为api/properties/[属性/ {[属性值]}的某些属性会产生一个相对干净,易于理解的格式。 –

+0

更新,否“用户(一个人)拥有一个房产(房子,街道地址等)。” –

回答

1

您正在混合2个独立的东西:您的实体(人员,财产)和您的业务逻辑。在我看来,你应该有Person和and Property类,而Person类将有一个属性集合,但是业务逻辑应该转到一个单独的组件,即PropertyComponent(或只是PropertyRepo)将具有方法GetPropertiesByState,GetPropertiesByUser等。

1

其余应该使用资源标识符来标识资源。在我看来,API的结构应该是

/api/users/ --> Get all users 
/api/users/{userId} --> Ger one user 
/api/users/{userId}/properties/ --> Get properties of one user 
/api/users/{userId}/properties/{propertyid} --> Get one property of one user 

获得性能

/api/properties/ --> Get all properties 
/api/properties/{propertyid} --> Get one properties 
/api/properties?filter=(zip:zipCodeValue) --> Get all properties by zip code 
/api/properties?filter=(state:stateValue) --> Get all properties by state 

休息https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm