SelfHosted AspNet WebAPI にカスタム MediaTypeFormatter を実装しました。依存関係の解決に Unity.WebApi を使用しました。コントローラー クラスは、モデル クラスによって実装されたインターフェイスについてのみ認識しますが、リポジトリは、アクションの結果として具体的なモデルを提供します。
ここで説明されているように、カスタム MediaTypeFormatter は BufferedMediaTypeFormatter から継承されます: http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters。
問題は、このメディア タイプ フォーマッタが機能していないことです。コードをデバッグするために使用しても、ReadFormStream メソッドがヒットすることはありません。誰か知っていますか:
- 考えられる問題は何ですか?
- インターフェイスをモデル クラスにマッピングするために Unity コンテナーに指示する必要がありますか?
- カスタム メディア タイプ フォーマッタ内の依存関係リゾルバーへの参照を取得するにはどうすればよいですか?
以下は、フォーマッタを追加するコードです。
var config = new SelfHostConfiguration("https://xxx.xxx.xxx.xxx:xxxx/");
config.Formatters.Add(new EntityTypeFormatter());
以下は、EntityController のコードです。
public class EntityController : ApiController
{
プライベート読み取り専用 IEntitiesRepository リポジトリ = null;
public EntityController(IEntitiesRepository リポジトリ)
{
if (リポジトリ == null)
{
新しい ArgumentNullException("リポジトリ") をスローします。
}
this.repository = リポジトリ;
}
public IEnumerable<IEntity> Get()
{
return (IEnumerable<IEntity>)repository.Get();
}
}
以下は、EntityRepository のコードです。
public class EntitiesRepository : IEntitiesRepository
{
public IEnumerable<IEntity> Get()
{
新しいエンティティを返す[]
{
新しいエンティティ
{
Prop1 = "プロパティ 1 の値",
Prop2 = "プロパティ 2 の値",
Prop3 = "プロパティ 3 の値"
}、
新しいエンティティ
{
Prop1 = "プロパティ 1 の値",
Prop2 = "プロパティ 2 の値",
Prop3 = "プロパティ 3 の値"
}
};
}
public IEntity Get (長い ID)
{
新しいエンティティを返す
{
Prop1 = Convert.ToString(id),
Prop2 = "プロパティ 2 の値",
Prop3 = "プロパティ 3 の値"
};
}
}
以下は、EntityMediaTypeFormatter クラスの実装です。
public class EntityMediaTypeFormatter : BufferedMediaTypeFormatter
{
public EntityMediaTypeFormatter()
: ベース()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
public override bool CanReadType(Type タイプ)
{
if (タイプ == null)
{
新しい ArgumentNullException("型") をスローします。
}
if (型は IEntity)
{
true を返します。
}
それ以外の場合 (type.IsGenericType)
{
戻り値 type.GenericTypeArguments.Single(a => a.GetType().Equals(typeof(IEntity))) != null;
}
false を返します。
}
public override bool CanWriteType(Type type)
{
if (タイプ == null)
{
新しい ArgumentNullException("型") をスローします。
}
if (型は IEntity)
{
true を返します。
}
false を返します。
}
パブリック オーバーライド オブジェクト ReadFromStream(Type タイプ、ストリーム readStream、HttpContent コンテンツ、IFormatterLogger formatterLogger)
{
if (type.IsInterface)
{
タイプ = GetConcreteType(タイプ);
}
return base.ReadFromStream(type, readStream, content, formatterLogger);
}
public override void WriteToStream(Type 型、オブジェクト値、ストリーム writeStream、HttpContent コンテンツ)
{
// 今のところ特別なことはありません...
base.WriteToStream(タイプ、値、writeStream、コンテンツ);
}
private Type GetConcreteType(型 type)
{
//TODO: 具体的な型を取得するために DependencyResolver への方法を見つける必要があります
typeof(エンティティ) を返します。
}
}
助けてくれてありがとう。