这是场景。
我有一个基于遗留插件的应用程序,数据库包含这样的表articles
:
create table articles(
id int primary key,
description varchar(100),
extension varchar(50)
)
不幸的是,数据库架构无法更改。
我想将此表映射到这样的灵活实体上:
public class Article
{
public virtual int Id { get; set; }
public virtual string Description { get; set; }
public virtual IDictionary<string, object> Plugins { get; set; }
}
每个扩展Article
的插件都将其列映射到专用词典项中。
例如,Plugin1定义:
public class Plugin1Entity
{
public virtual string Extension { get; set; }
}
列id
和description
属于核心应用程序,而extension
由插件定义和管理。
当我阅读这篇文章时,我想得到一个像这样的对象:
new Article
{
Id = 12,
Description = "some description",
Plugins = new Dictionary<string, object>
{
["Plugin1"] = new Plugin1
{
Extension = "some value"
}
}
}
插件是通过MEF动态加载的,因此我无法直接从类Plugin1Entity
引用Article
。我在Article
中都没有插件的属性,因为它们仅在运行时才知道:这就是为什么我们希望拥有Dictionary
。
理想情况下,映射类似于:
public class ArticleMap : ClassMap<Article>
{
public ArticleMap()
{
Table("articles");
Id(i => i.Id, "id").GeneratedBy.Assigned();
Map(i => i.Description);
}
}
public class Plugin1Mapping : ComponentMap<Plugin1Entity>
{
public Plugin1Mapping()
{
Map(i => i.Extension);
}
}
到目前为止,我们使用自定义IPropertyAccessor
获得了一些结果,该自定义{@ 1}}动态地将插件实体映射到字典字段而不是Article
属性上。
如何映射这种模型?还有其他可行的方法来动态扩展具有在不同程序集中定义的字段的基本实体吗?