2011-03-15 65 views
1

虚拟呼叫我有一个实体宣称与此类似:流利NHibrnate - 在构造 - 最佳实践

public class Comment 
{ 
    public Comment(string text, DateTime creationDate, string authorEmail) 
    { 
    Text = text; 
    CreationDate = creationDate; 
    AuthorEmail = authorEmail; 
    } 

    public virtual string Text { get; private set; } 
    public virtual DateTime CreationDate { get; set; } 
    public virtual string AuthorEmail { get; private set; } 
} 

我从Is it OK to call virtual properties from the constructor of a NHibernate entity?

采取它我得到警告为“在构造虚拟呼叫”。

虽然它不会造成任何实际问题,因为虚拟成员只是为NH代理而声明的。但是,如果我应该移动的构造方法到一个新的工厂用新的方法,我在想,被宣布为

CreateComment(string text, DateTime creationDate, string authorEmail) 

什么会在这种情况下,最好的做法是什么?

请注意,目前我的域实体中有4-5个重载构造函数。以上只是一个例子。
谢谢!

回答

0

我喜欢有一个参数(缺省)构造和建造像这样:

var comment = new Comment { 
        Text = "Something offensive and political.", 
        CreationDate = DateTime.Now, 
        AuthorEmail = "[email protected]" 
       }; 

现在的问题并不重要。

+0

怎么样,我需要从外面传值的方法:(字符串文本,日期creationDate,串AUTHOREMAIL) – iniki 2011-03-15 16:05:48

+0

@iniki:Huh?I不明白你的意思,因为你可以简单地说'var comment = new Comment {Text = GetText(),CreationDate = GetCreationDate(),AuthorEmail = GetAuthorEmail()};' – jason 2011-03-15 16:32:02

+0

Jason对不起,但我想我是在这里忽略了你的观点:-(实际上,我现在所需的重载构造函数需要将对象成员设置为从客户端应用程序接收的值。不知道我怎么能在无参数的构造函数中做到这一点。你能否详细说明你的答案? – iniki 2011-03-16 12:20:40

0

如果你的属性仅是虚拟的,以适应NHibernate的,你可以让他们封装具体领域(NHibernate的知道如何应对是:看here(默认访问)和here(访问)
它用流利的支持。NH以及

1

我与FluentNHibernate测试,你可以做这样的:

public class Comment 
{ 
    private string _text; 
    private DateTime _creationDate; 
    private string _authorEmail; 

    public Comment(string text, DateTime creationDate, string authorEmail) 
    { 
     _text = text; 
     _creationDate = creationDate; 
     _authorEmail = authorEmail; 
    } 

    public virtual string Text 
    { 
     get { return _text; } 
     private set { _text = value; } 
    } 

    public virtual DateTime CreationDate 
    { 
     get { return _creationDate; } 
     set { _creationDate = value; } 
    } 

    public virtual string AuthorEmail 
    { 
     get { return _authorEmail; } 
     private set { _authorEmail = value; } 
    } 
}