Автокартопостроитель и неизменность

Действительно ли возможно использовать AutoMapper с Неизменными типами?

Например, мой Доменный тип неизменен, и я хочу отобразить свой тип представления на это.

Я полагаю, что это не, слишком просто хотят, это подтвердило.

Также, поскольку это - лучшая практика, чтобы иметь Ваши доменные неизменные типы, какова лучшая практика при отображении типов представления на доменные типы?

9
задан Ruben Bartelink 1 November 2013 в 00:37
поделиться

2 ответа

Я портировал и взломал этот код из 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, помимо всех перечисленных, может быть проверка. Проверка вводимых пользователем данных или бизнес-объектов.

Связанные статьи, которые необходимо просмотреть.

-121--1054921-

Я обычно выполняю сопоставление типов представлений с типами доменов вручную, так как обычно буду работать через более сложный интерфейс, используя методы и Если вы используете AutoMapper для перехода от вида к домену, вы теперь заблокированы в модели анемического домена, независимо от того, было ли вы намеренно принято решение.

9
ответ дан 4 December 2019 в 20:23
поделиться

AutoMapper полагается на средства задания свойств для выполнения своей работы, поэтому, если у вас есть свойства только для чтения, AutoMapper не принесет особой пользы.

Вы можете переопределить поведение сопоставления и, например, настроить его для вызова определенного конструктора, но это в основном сводит на нет цель AutoMapper, потому что тогда вы выполняете сопоставление вручную, и вам удалось только добавить неуклюжий дополнительный шаг в процессе.

Для меня не имеет большого смысла, что ваша модель предметной области неизменна. Как вы его обновляете? Все приложение доступно только для чтения? И если да, то зачем вам вообще нужно отображать в вашу модель предметной области, а не из ? Неизменяемая модель предметной области звучит ... довольно бесполезно.

П.С. Я предполагаю, что вы имеете в виду этот AutoMapper , а не функцию автоматического сопоставления в Fluent NHibernate или даже какую-то другую совершенно другую вещь. Если это не так, вам следует быть более конкретным и добавить теги для своей платформы / языка.

2
ответ дан 4 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: