如何防止ODataConventionModelBuilder自动公开所有派生类型';元数据
本文关键字:类型 派生 元数据 ODataConventionModelBuilder 何防止 | 更新日期: 2023-09-27 18:26:04
我正在使用ODataConventionModelBuilder为Web API OData服务构建Edm模型,如下所示:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet<Z>("Z");
IEdmModel edmModel = builder.GetEdmModel();
类Z位于一个程序集中,并且有公共类Q派生自位于不同程序集中的Z。
ODataConventionModelBuilder将生成Edm模型,包括Q类(以及其他派生类)的定义,并且它将与服务元数据一起公开。在我们的情况下,这是不可取的。
当派生类不可访问(例如定义为内部)时,这样的问题当然不存在。
有没有办法强制ODataConventionModelBuilder不自动公开所有派生类型的元数据?
这应该有效:
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet("Z");
builder.Ignore<Q>();
IEdmModel edmModel = builder.GetEdmModel();
没有办法禁用自动发现,这是故意的。请参见此处。
不过,有一个变通办法。您必须显式忽略每个派生类型,然后继续手动映射每个派生类型。这里有一个很好的循环来忽略派生类型:
var builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet<Z>("Z");
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => t.IsSubclassOf(typeof(Z)));
foreach (var type in types)
builder.Ignore(types.ToArray());
//additional mapping of derived types if needed here
var edmModel = builder.GetEdmModel();
查看我的博客文章了解更多详细信息。