如何通过添加属性来扩展存在于不同dll中的类?使用C#。

5

我有一个n层应用程序,其中包含不同程序集中的许多层。 我使用实体框架6.1,并希望将ObjectState属性添加到基础实体以跟踪实体状态。问题是BaseEntity位于我的域对象dll中,该dll与数据库无关,而我想在实体框架项目中添加ObjectState,因为这个属性与实体框架相关。如何实现这个行为?

public enum ObjectState
{
    Unchanged,
    Added,
    Modified,
    Deleted
}
public interface IObjectState
{
    [NotMapped]
    ObjectState ObjectState { get; set; }
}

如果类是公共的且未密封,那么继承会有什么问题?我觉得我在这里漏掉了什么。 - Zohar Peled
问题是NotMapped属性吗?你可以使用EF的流畅配置来确保该属性不被映射,而不是使用NotMapped属性吗? - David Gardiner
你好,我不想将ObjectState属性添加到我的基本实体中,因为这是我的领域的基础,而这个属性是Entity Framework特定的。 - yo2011
2个回答

2
你可以使用分部类,如果你可以编辑你的领域对象项目的代码并将基本实体声明为分部类。
namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        // Your properties and method
    }
}

在您的Entity Framework项目中,您可以添加以下代码:
namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        public enum ObjectState
        {
            Unchanged,
            Added,
            Modified,
            Deleted
        }
        public interface IObjectState
        {
            [NotMapped]
            ObjectState ObjectState { get; set; }
        }
    }
}

如果您无法编辑域项目中的文件或不喜欢这种方法,也许可以使用继承来解决问题。在您的Entity Framework项目中创建一个类,如下所示。

namespace YourProjectNameSpace 
{
    public class StatefulEntityClassName : BaseEntity
    {
        public enum ObjectState
        {
            Unchanged,
            Added,
            Modified,
            Deleted
        }
        public interface IObjectState
        {
            [NotMapped]
            ObjectState ObjectState { get; set; }
        }
    }
}

希望这可以帮助您。

4
谢谢,但是局部类必须在同一个项目(dll)中。 - yo2011

0
如果您的意思是无法在BaseEntity中实现IObjectState,因为它必须独立于EF特定,则应该有两组实体 - 一组用于域,一组用于EF,并在这些集合之间使用映射(可能是Automapper)。
// domain entities assembly
public abstract class BaseEntity { }

// EF entities assembly
public abstract class BaseEFEntity : IObjectState

// somewhere in the code
Mapper.Map(domainEntity, efEntity);

实际上,在使用分层架构时,这是一种更可取的方式,每个层操作其特定的模型。


感谢您的帮助,但这将增加另一层,因为我已经有了Dto层,所以会给应用程序增加复杂性。 - yo2011

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接