使用虚拟属性来支持 NHibernate 代理;ReSharper 警告构造函数中的虚拟成员调用



我正在尝试通过将实体的属性标记为虚拟来支持我的实体的 NHibernate 代理:

public class Video : IAbstractDomainEntity<string>
{
    public virtual string Id { get; set; }
    public virtual string Title { get; set; }
    public virtual int Duration { get; set; }
    public virtual string Author { get; set; }
    public virtual bool HighDefinition { get; set; }
    public Video()
    {
        Id = string.Empty;
        Title = string.Empty;
        Author = string.Empty;
    }
}

ReSharper 指出,由于此处描述的问题,这是不好的做法:构造函数中的虚拟成员调用

理解这个问题,我也明白我不能将我的类标记为密封,因为这样 NHibernate 将无法从实体生成代理。

我只是忍受衰落,并确保不对我的二传手做任何奇怪的事情吗?

最佳做法是将属性与支持字段一起使用:

public class Video : IAbstractDomainEntity<string>
{
    private string _id;
    private string _title;
    private string _author;
    public virtual string Id
    {
        get { return _id; }
        set { _id = value; }
    }
    public virtual string Title
    {
        get { return _title; }
        set { _title = value; }
    }
    public virtual string Author
    {
        get { return _author; }
        set { _author = value; }
    }
    public virtual int Duration { get; set; }
    public virtual bool HighDefinition { get; set; }
    public Video()
    {
        _id = string.Empty;
        _title = string.Empty;
        _author = string.Empty;
    }
}

因此,您可以避免子类出现问题,并且不再看到任何警告

我更喜欢更简洁、封装的变体:

public class Video : IAbstractDomainEntity<string>
{
    public virtual string Id { get; protected set; }
    public virtual string Title { get; protected set; }
    public virtual string Author { get; protected set; }
    public virtual int Duration { get; protected set; }
    public virtual bool HighDefinition { get; protected set; }
    public static Video Create()
    {
        return new Video 
        {
            Id = string.Empty,
            Title = string.Empty,
            Author = string.Empty
        }
    }
}

相关内容

最新更新