Действительно ли возможно использовать AutoMapper с Неизменными типами?
Например, мой Доменный тип неизменен, и я хочу отобразить свой тип представления на это.
Я полагаю, что это не, слишком просто хотят, это подтвердило.
Также, поскольку это - лучшая практика, чтобы иметь Ваши доменные неизменные типы, какова лучшая практика при отображении типов представления на доменные типы?
Я портировал и взломал этот код из MvcSitemap:
public static class SecurityTrimmingExtensions
{
/// <summary>
/// Returns true if a specific controller action exists and
/// the user has the ability to access it.
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="actionName"></param>
/// <param name="controllerName"></param>
/// <returns></returns>
public static bool HasActionPermission( this HtmlHelper htmlHelper, string actionName, string controllerName )
{
//if the controller name is empty the ASP.NET convention is:
//"we are linking to a different controller
ControllerBase controllerToLinkTo = string.IsNullOrEmpty(controllerName)
? htmlHelper.ViewContext.Controller
: GetControllerByName(htmlHelper, controllerName);
var controllerContext = new ControllerContext(htmlHelper.ViewContext.RequestContext, controllerToLinkTo);
var controllerDescriptor = new ReflectedControllerDescriptor(controllerToLinkTo.GetType());
var actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
return ActionIsAuthorized(controllerContext, actionDescriptor);
}
private static bool ActionIsAuthorized(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
return false; // action does not exist so say yes - should we authorise this?!
AuthorizationContext authContext = new AuthorizationContext(controllerContext);
// run each auth filter until on fails
// performance could be improved by some caching
foreach (IAuthorizationFilter authFilter in actionDescriptor.GetFilters().AuthorizationFilters)
{
authFilter.OnAuthorization(authContext);
if (authContext.Result != null)
return false;
}
return true;
}
private static ControllerBase GetControllerByName(HtmlHelper helper, string controllerName)
{
// Instantiate the controller and call Execute
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(helper.ViewContext.RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentUICulture,
"Controller factory {0} controller {1} returned null",
factory.GetType(),
controllerName));
}
return (ControllerBase)controller;
}
Это может использовать некоторое кэширование, но для моего случая это была преждевременная оптимизация.
-121--2349456-Одним из эффективных способов использования AOP, помимо всех перечисленных, может быть проверка. Проверка вводимых пользователем данных или бизнес-объектов.
Связанные статьи, которые необходимо просмотреть.
Я обычно выполняю сопоставление типов представлений с типами доменов вручную, так как обычно буду работать через более сложный интерфейс, используя методы и Если вы используете AutoMapper для перехода от вида к домену, вы теперь заблокированы в модели анемического домена, независимо от того, было ли вы намеренно принято решение.
AutoMapper полагается на средства задания свойств для выполнения своей работы, поэтому, если у вас есть свойства только для чтения, AutoMapper не принесет особой пользы.
Вы можете переопределить поведение сопоставления и, например, настроить его для вызова определенного конструктора, но это в основном сводит на нет цель AutoMapper, потому что тогда вы выполняете сопоставление вручную, и вам удалось только добавить неуклюжий дополнительный шаг в процессе.
Для меня не имеет большого смысла, что ваша модель предметной области неизменна. Как вы его обновляете? Все приложение доступно только для чтения? И если да, то зачем вам вообще нужно отображать в вашу модель предметной области, а не из ? Неизменяемая модель предметной области звучит ... довольно бесполезно.
П.С. Я предполагаю, что вы имеете в виду этот AutoMapper , а не функцию автоматического сопоставления в Fluent NHibernate или даже какую-то другую совершенно другую вещь. Если это не так, вам следует быть более конкретным и добавить теги для своей платформы / языка.