Я придумал два подхода к этому.
Первый добавить код в мой класс NHibernate Repository перевести простой тип POCO, используемый контроллером MVC (SimpleThing) к типу сущности, NHibernate хотел (RealThing):
/// <summary>
/// A NHibernate generic repository. Provides base of common
/// methods to retrieve and update data.
/// </summary>
/// <typeparam name="T">The base type to expose
/// repository methods for.</typeparam>
/// <typeparam name="K">The concrete type used by NHibernate</typeparam>
public class NHRepositoryBase<T, K>
: IRepository<T>
where T : class
where K : T, new()
{
// repository methods ...
/// <summary>
/// Return T item as a type of K, converting it if necessary
/// </summary>
protected static K GetKnownEntity(T item) {
if (typeof(T) != typeof(K)) {
K knownEntity = new K();
foreach (var prop in typeof(T).GetProperties()) {
object value = prop.GetValue(item, null);
prop.SetValue(knownEntity, value, null);
}
return knownEntity;
} else {
return (K)item;
}
}
Итак, любой метод в репозитории может вызвать GetKnownEntity (элемент T), и он скопирует свойства элемента, который вы передаете, в тип, который хочет NHibernate. Очевидно, это было немного неуклюже, поэтому я посмотрел на пользовательские привязки моделей.
Во втором подходе, я создал пользовательские модели связующего, как это:
public class FactoryModelBinder<T>
: DefaultModelBinder
where T : new()
{
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext,
Type modelType) {
return new T();
}
}
Тогда я зарегистрировал, что в Global.asax.cs с:
ModelBinders.Binders.Add(typeof(IThing),
new FactoryModelBinder<RealThing>());
И это работает отлично с помощью действия контроллера, которое выглядит следующим образом:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult NewThing([Bind(Exclude = "Id")] IThing thing) {
// code to process the thing goes here
}
Мне нравится второй подход, но большая часть моих инъекционных материалов зависит от класса Controller. Мне не нравится добавлять все эти сопоставления ModelBinder в Global.asax.cs.
Привет, пользователь10789, поставили ли вы эту стремительную награду? –