2010-03-12 71 views
1

我正在使用模型UserRepository->用户什么是只读属性的最佳方法

存储库用于保存和加载用户。

我希望能够在存储库中设置ID,但我不希望它被UI访问。

User和Repository可在Core项目中找到,并可在Web中找到UI。

有没有办法做到这一点,就像属性的修饰符,或者我应该把ID放在User构造器中?

感谢

回答

8

您可以使用属性,而不setter和私有变量是这样的:

private int _id; //Set locally 
public int ID 
{ 
    get { return _id; } 
} 
//in the class _id = 5; 

或者使用自动属性,像这样的私人二传手:

public int ID { get; private set; } 
//in the class ID = 5; this won't work outside the class 

在第二个/自动的情况下,它确实只是编译器做第一个例子,只是更快,更容易。

+0

+1您的回答比我的好:) – Kelsey 2010-03-12 19:47:59

+0

如果适用,您可以使用保护而不是私人。这将适用于第一版和自动属性版本。 – Brian 2010-03-12 21:33:05

+1

@Brian - 好点,如果您只想在同一个程序集中公开它,也可以使用'internal'修饰符。在这种情况下,您的数据层可以设置它,但不是另一个项目中的UI层,等等。 – 2010-03-12 21:37:43

-1

我已经使用这个彭定康(不熟悉C#这样,但这个想法应该工作):

class Foo 
{ 
    protected int id; 

    public int GetID() 
    { 
     return (ID); 
    } 
} 

class MutableFoo : Foo 
{ 
    public void SetID(int val) 
    { 
     id = val; 
    } 
} 

那么UI只与它的“富”类交易只读,而其它部分可以处理读/写的“MutableFoo”。您应该只能创建“MutableFoo”的实例,然后将它们传递到代码的其他部分,然后将其作为“Foo”接收,这是UI代码对对象具有只读访问权限,而其他部分可以读取 - 写入访问。

我可能会做“富”抽象以及(我想不到的情况下,我没有)。

+0

-1:这不是在C#中完成的方式。 – Brian 2010-03-12 21:30:10

+0

这就是Java ...... – Dykam 2010-03-12 21:50:37

+0

不仅仅是Java ......在多种语言中使用它。就这样,我明白了,A类的C#属性如何给出2个类(例如X表示只读,Y表示读/写)访问? – TofuBeer 2010-03-13 00:54:37

相关问题