我在 SelfHosted AspNet WebAPI 中实现了自定义 MediaTypeFormatter。我使用 Unity.WebApi 进行依赖解析。控制器类只知道模型类实现的接口,而存储库将具体模型作为操作的结果。
自定义 MediaTypeFormatter 继承自 BufferedMediaTypeFormatter,如下所述:http ://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters 。
问题是这个媒体类型格式化程序不工作。即使我用来调试代码,ReadFormStream 方法也不会被命中。有人知道吗:
- 可能的问题是什么?
- 我需要告诉统一容器将接口映射到模型类吗?
- 如何在自定义媒体类型格式化程序中获取对依赖解析器的引用?
下面是添加格式化程序的代码:
var config = new SelfHostConfiguration("https://xxx.xxx.xxx.xxx:xxxx/");
config.Formatters.Add(new EntityTypeFormatter());
下面是 EntityController 的代码:
公共类 EntityController : ApiController
{
私有只读 IEntitiesRepository 存储库 = null;
公共实体控制器(IEntitiesRepository 存储库)
{
如果(存储库 == null)
{
throw new ArgumentNullException("repository");
}
this.repository = 存储库;
}
公共 IEnumerable<IEntity> Get()
{
return (IEnumerable<IEntity>)repository.Get();
}
}
下面是 EntityRepository 的代码:
公共类 EntitiesRepository : IEntitiesRepository
{
公共 IEnumerable<IEntity> Get()
{
返回新实体[]
{
新实体
{
Prop1 = "属性 1 的值",
Prop2 = "属性 2 的值",
Prop3 = "属性 3 的值"
},
新实体
{
Prop1 = "属性 1 的值",
Prop2 = "属性 2 的值",
Prop3 = "属性 3 的值"
}
};
}
公共 IEntity 获取(长 id)
{
返回新实体
{
Prop1 = Convert.ToString(id),
Prop2 = "属性 2 的值",
Prop3 = "属性 3 的值"
};
}
}
下面是 EntityMediaTypeFormatter 类的实现:
公共类 EntityMediaTypeFormatter : BufferedMediaTypeFormatter
{
公共 EntityMediaTypeFormatter()
: 根据()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
public override bool CanReadType(Type type)
{
如果(类型 == 空)
{
抛出新的 ArgumentNullException("type");
}
如果(类型是 IEntity)
{
返回真;
}
否则如果(类型。IsGenericType)
{
返回 type.GenericTypeArguments.Single(a => a.GetType().Equals(typeof(IEntity))) != null;
}
返回假;
}
public override bool CanWriteType(Type type)
{
如果(类型 == 空)
{
抛出新的 ArgumentNullException("type");
}
如果(类型是 IEntity)
{
返回真;
}
返回假;
}
public override object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
如果(类型。IsInterface)
{
类型 = 获取混凝土类型(类型);
}
return base.ReadFromStream(type, readStream, content, formatterLogger);
}
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
{
//暂时没有什么特别的...
base.WriteToStream(类型,值,writeStream,内容);
}
私有类型 GetConcreteType(类型类型)
{
//TODO: 需要想办法通过DependencyResolver获取具体类型
返回类型(实体);
}
}
提前感谢您的帮助。