2017-02-27 27 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