我有一个如下所示的课程;
public class AccommPropertyRepository : IAccommPropertyRepository {
public AccommPropertyRepository() {
}
public AccommPropertyRepository(int _accommPropertyID) {
accommPropertyID = _accommPropertyID;
}
private readonly int accommPropertyID;
private Guid _accommpropertyguid;
public AccommProperty GetSingle(int id) {
//Logic sits here and returns single AccommProperty class
}
public Guid AccommPropertyGUID {
get {
var model = GetSingle(accommPropertyID);
_accommpropertyguid = model.AccommPropertyGUID;
return _accommpropertyguid;
}
set {
}
}
}
如您所见,有一个名为AccommPropertyGUID
的公共财产。我已经测试了代码,它返回它应该的内容,但我不确定我的代码是以正确的方式编写的。
我是否在这里实施了这个结构?
更新
我的目标是能够按如下方式调用此类;
var poo = new AccommPropertyRepository(1000);
var pooGUID = poo.AccommPropertyGUID;
答案 0 :(得分:4)
虽然问题是关于这里的属性,但如果你看一个很抽象的层次,即在班级你会发现一些奇怪的东西。该类用于表示AccomProperty的存储库。现在,它是一个简单的存储库定义,它存储(由底层持久存储抽象)特定类型的对象,并允许您对这些对象执行某些操作(如访问,删除等)。所以使用像
这样的存储库var poo = new AccommPropertyRepository(1000);
var pooGUID = poo.AccommPropertyGUID;
在我的POV中不是一个好主意。由于此代码表示您正在创建存储库对象以仅访问具有标识1000的特定住房属性对象,其中存储库应允许访问基础存储对象而不仅仅访问单个对象。使用存储库的更好方法是:
var repo = new AccommPropertyRepository(repInitializationData) //initialization data can be something like conn string etc
var pooGUID = repo.GetAccommProperty(1000).GUID
这样访问GUID属性是对象的一部分而不是存储库的一部分,因为属性是实际对象而不是存储库的责任。存储库只是为了允许您访问底层的对象集。
我希望这是有道理的。
答案 1 :(得分:2)
你的二传手看起来不对。您需要在其中设置_accommpropertyguid
或完全删除它。您可以在传入的值上添加验证。您需要决定是否要在该属性上设置一个setter。这是最简单的实现:
set { _accommpropertyguid = value; }
getter对我来说看起来不错,但是在不了解GetSingle
的实现的情况下很难说清楚。
一般来说,使用getter应该没有任何副作用,它应该是 fast 。
答案 2 :(得分:0)
它看起来很好,如果你想要一个清晰的代码,你可以删除空的set block。
但如果没有分配“accommPropertyID”,我不确定会发生什么? 你有2个构造函数,第一个没有任何赋值给“accommPropertyID” 这样你的一些功能可能会出错。您可以使用try-catch博客或您 必须为“accommPropertyID”指定默认值,否则必须删除第一个 构造
答案 3 :(得分:0)
我认为你应该这样做
public Guid AccommPropertyGUID
{
get
{
if(null != _accommpropertyguid)
{
var model = GetSingle(accommPropertyID);
_accommpropertyguid = model.AccommPropertyGUID;
}
return _accommpropertyguid;
}
}
通过这种方式,您不必每次都重新计算_accommpropertyguid值