属性私人设置;
我知道它只允许class级设置,但是有什么意义呢?
如何解决只读id的问题?
说我有一个人课:
public class Person { public string Name { get; set; } public int Id { get; private set; } public int Age { get; set; } }
这是在一个Entities.dll
,由GUI,BL和DAL使用。
GUI调用BL:
List<Person> p = BL.PeopleBL.GetPeople();
为了举例说明DAL:
... while(dr.read()) { returnPersonList.add( new Person{ Age=dr.GetInt32(1), Id=dr.GetInt32(0), Name=dr.GetString(2)}) } ...
当然我不能这样做因为Id是一个私人的集合; 什么是正确的方法来做到这一点?
我怎么能让BL / Dal设置ID,但不是在GUI上?
或者这是不是正确使用私人设置?
我只是想补充说,这是你典型的数据库应用程序,其中pk是Id,不应该改变(只能通过BL / DAL)
这是一个可能的解决scheme,虽然不是很干净:
- 使您需要暴露的属性BAL&DAL
internal
- Mark
BAL.dll
&DAL.dll
内部在assemblyinfo.cs
可见
public class Person { public Person(int id) { this.Id=id; } public string Name { get; set; } public int Id { get; internal set; } public int Age { get; set; } }
AssemblyInfo.cs
为Entities.dll
[assembly: InternalsVisibleTo("DAL"), InternalsVisibleTo("BAL")]
这样,DAL&BAL就可以看到所有的内部结构。 这可能并不理想,但我只是提出一个可能的解决scheme。
两种常用的方法是,类应该有DAL使用的构造函数,或者DAL应该使用reflection来保存对象。
或者你可以做
public class Person { public Person(int id) { this.Id=id; } public string Name { get; set; } public int Id { get; private set; } public int Age { get; set; } }
也许我是误解,但如果你想真正只读Ids为什么不使用实际只读字段?
public class Person { public Person(int id) { m_id = id; } readonly int m_id; public int Id { get { return m_id; } } }
您可以让用户通过构造函数提供它来设置只读属性:
public class Person { public Person(int id) { this.Id = id; } public string Name { get; set; } public int Id { get; private set; } public int Age { get; set; } }
也许,你可以把它们标记为内部的,在这种情况下,只有DAL或BL中的类(假设它们是独立的dll)才能够设置它。
你也可以提供一个构造函数来获取这些字段,然后将它们作为属性公开。
通常情况下,ID不是实体的自然部分,而是需要将数据库工件抽象出来。
这是一个devise决定 – 只允许在施工过程中或通过方法调用来设置ID,所以它由class级内部pipe理。
你可以自己写一个setter,假设你有一个支持字段:
private int Id = 0; public void SetId (int id) { this.Id = id; }
或者通过构造函数:
private int Id = 0; public Person (int id) { this.Id = id; }
while(dr.read()) { returnPersonList.add( new Person(dr.GetInt32(1), dr.GetInt32(0), dr.GetString(2))); }
哪里:
public class Person { public Person(int age, int id, string name) { Age = age; Id = id; Name = name; } }
根据我的应用范围,我喜欢把对象水合机制放在对象本身。 我将用自定义对象包装数据读取器,并将查询返回后执行的委托传递给它。 该委托获取通过DataReader。 然后,因为我在我的智能商业对象,我可以与我的私人定居者津津乐道。
编辑伪码
“DataAccessWrapper”包装了我所有的连接和对象生命周期pipe理。 所以,当我调用“ExecuteDataReader”时,它会创build与传递的proc(有一个params重载)的连接,执行它,执行委托,然后自行清理。
public class User { public static List<User> GetAllUsers() { DataAccessWrapper daw = new DataAccessWrapper(); return (List<User>)(daw.ExecuteDataReader("MyProc", new ReaderDelegate(ReadList))); } protected static object ReadList(SQLDataReader dr) { List<User> retVal = new List<User>(); while(dr.Read()) { User temp = new User(); temp.Prop1 = dr.GetString("Prop1"); temp.Prop2 = dr.GetInt("Prop2"); retVal.Add(temp); } return retVal; } }