Есть несколько разных моментов, которые вы можете внедрить в IMappingService.http://codeclimber.net.nz/archive/2009/04/08/13-asp.net-mvc-extensibility-points-you-have-to-know.aspx - хороший сайт для помощи в выборе подходящих точек расширения для .NET MVC.
Если вы хотите придерживаться того, чтобы эта функциональность была производным ActionResult, то я думаю, что вы могли бы поместить зависимость в ActionInvoker, если хотите, но Контроллер имеет для меня больше смысла.Если вам не нужен IMappingService в контроллере, вы всегда можете обернуть его в HybridViewResultFactory и получить доступ к этому объекту в контроллере.В этом случае ваши ярлыки будут выглядеть следующим образом:
public HybridViewResult<TSourceElement, TDestinationElement> AutoMappedHybridView<TSourceElement,TDestinationElement>(PagedList<TSourceElement> pagedList, string viewNameForAjaxRequest)
{
HybridViewResultFactory.Create<TSourceElement, TDestinationElement>(pagedList, viewNameForAjaxRequest);
}
и т. Д.
Я не уверен, почему вам нужно использовать ActionResult, но если нет причины, которая делает это явнонеобходимо создать класс HybridViewModel и класс HybridViewModelBinder, который внедряется с зависимостью службы сопоставления.
Я предполагаю, что вы хотите использовать внедрение конструктора, но если в сборке пользовательского интерфейса есть зависимость StructureMap, выможет получить доступ к классу решателя статических зависимостей (как сказал Clowers).
На этот вопрос было бы легче дать определенный ответ, если бы я понял, почему вы используете ActionResult.
Похоже, вы используете результат действия для обработки двухфункциональные возможности, которые не обязательно идут вместе все время, и которые можно использовать отдельно.Кроме того, нет четкого указания на то, что он должен быть в ActionResult.
Предположительно, вы могли бы (а) использовать функциональность Automapper для результатов, отличных от вывода html (ViewResult), и (б) вы могли быиспользовать функциональность автоматического определения ajax-запросов без необходимости автоматизировать модель.
Мне кажется, что автоматическое отображение модели представления можно использовать для непосредственного внедрения модели представления в действие контроллера, удаляя таким образомзависимость контроллера от IMappingService.Вам понадобится класс ModelBinder для внедрения в IMappingService (реализация которого, как я полагаю, содержит зависимость от типа репозитория или хранилища данных).
Вот хорошая статья, объясняющая, как использовать связыватели моделей: http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx.
Затем вы можете перезаписать DefaultModelBinder в классах, которые должны быть автоматически сопоставлены, следующим образом:
public ActionResult DoItLikeThis([AutoMap(typeof(MyDomainModelClass))]MyViewModelClass viewModel){
//controller action logic
}
Теперь, что касается HybridViewResult, я бы предложил вам обработать это с помощью Action Filterвместо.Таким образом, вы можете просто использовать ActionResult или ViewResultBase в качестве типа Result вашего метода действия и украсить его фильтром действия, то есть:
[AutoSelectViewResult]
public ViewResultBase AndDoThisLikeSo(){
//controller action logic
}
Я думаю, что в целом это будет гораздо лучшим решением, чем объединение этих двух.функциональные возможности для ActionResult.