属性私人设置;

我知道它只允许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,虽然不是很干净:

  1. 使您需要暴露的属性BAL&DAL internal
  2. Mark BAL.dllDAL.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.csEntities.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; } }