【问题标题】:Using virtual properties to support NHibernate proxies; ReSharper warns of virtual member call in constructor使用虚拟属性来支持 NHibernate 代理; ReSharper 警告构造函数中的虚拟成员调用
【发布时间】:2024-04-13 19:30:02
【问题描述】:

我正在尝试通过将实体的属性标记为虚拟来支持我的实体的 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 指出,由于此处描述的问题,这是一种不好的做法:Virtual member call in a constructor

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

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

【问题讨论】:

标签: c# nhibernate virtual


【解决方案1】:

最佳实践是使用带有支持字段的属性:

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;
    }
}

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

【讨论】: