c#DAL类和业务层类

c#DAL类和业务层类,c#,class-design,C#,Class Design,嗨 你能告诉我这是否可行吗 public class Person { public string Name { get; set; } public int ID { get; set; } } 使用在另一个名为DataAccessLayer的程序集中完成的代码填充一个类调用(例如,位于这样一个名为Entities的程序集中的person)(因此person和填充它的位置不在同一个程序集中) //下面的代码可能是从datareader等读取的,但这样做只是为了便于解释 Per

你能告诉我这是否可行吗

public class Person
{
    public string Name { get; set; }
    public int ID { get; set; }
}
使用在另一个名为DataAccessLayer的程序集中完成的代码填充一个类调用(例如,位于这样一个名为Entities的程序集中的person)(因此person和填充它的位置不在同一个程序集中)

//下面的代码可能是从datareader等读取的,但这样做只是为了便于解释

Person p=new Person();
p.Name="tom";
p.id = 10;
person类现在可以被另一个系统访问,以允许他们访问person。我想要的是防止其他系统能够更改ID。能够读取但不能写入。我是否需要创建另一个类等来允许此操作,并且只将此类公开给其他系统(即业务对象)(即ORM)

我知道很多人会说只需将ID设置为只读即可。i、 e

public int ID { get; }
但是如果我这样做,那么我就无法从类似于上面的代码中填充ID,因为在我的DataAccessLayer中,我将无法设置ID,因为它是只读的

谢谢
Niall

您可以为可以将ID传递到的对象创建一个
内部
构造函数,然后为实体DLL设置标志,以允许另一个DLL(DataAccessLayer)能够查看和使用此DLL内的内部调用。(
InternalsVisibleTo
属性)

您可以为可以将ID传递到的对象创建
internal
构造函数,然后为实体DLL设置标志,以允许另一个DLL(DataAccessLayer)能够查看和使用此DLL内的内部调用。(
InternalsVisibleTo
attribute)

查看将为您分配实体ID的ORM工具,您的ID属性将显示:

public class MyEntity
{
     public virtual int ID { get; protected set; }

     // other properties
}

如果您选择这种方式,就不必担心分配属性和类型转换。

查看ORM工具,它将为您分配实体ID,您的ID属性将显示:

public class MyEntity
{
     public virtual int ID { get; protected set; }

     // other properties
}

如果选择这种方式,您就不必担心分配属性和类型强制转换。

为什么不保留只读属性,并通过构造函数简单地设置支持变量的值?为什么不保留只读属性,并通过构造函数简单地设置支持变量的值?是,这比我的解决方案具有更好的封装性(在包含程序集之外没有构造函数的可视性)是的,这比我的解决方案具有更好的封装性(在包含程序集之外没有构造函数的可视性)