将umbraco节点映射到strongtyped对象

时间:2012-04-18 07:06:21

标签: automapper umbraco valueinjecter

我正在使用Umbraco 4.7.1,我正在尝试将内容节点映射到一些自动生成的强类型对象。我尝试过使用valueinjecter和automapper,但OOTB都没有映射我的属性。我想这是因为Umbraco节点上的所有属性(cms文档)都是这样检索的:

node.GetProperty("propertyName").Value;

我的强类型对象的格式为MyObject.PropertyName。那么如何将使用方法检索的节点上的属性和以小写字符开头的字符串映射到MyObject上属性以大写字符开头的属性?

更新 我设法创建了以下代码,通过在Umbraco源代码中挖掘如何将字符串属性强制转换为强类型属性来映射umbraco节点(如预期):

    public class UmbracoInjection : SmartConventionInjection
{
    protected override bool Match(SmartConventionInfo c)
    {
        return c.SourceProp.Name == c.TargetProp.Name;
    }

    protected override void Inject(object source, object target)
    {
        if (source != null && target != null)
        {

            Node node = source as Node;

            var props = target.GetProps();
            var properties = node.Properties;

            for (int i = 0; i < props.Count; i++)
            {
                var targetProperty = props[i];
                var sourceProperty = properties[targetProperty.Name];
                if (sourceProperty != null && !string.IsNullOrWhiteSpace(sourceProperty.Value))
                {
                    var value = sourceProperty.Value;
                    var type = targetProperty.PropertyType;
                    if (targetProperty.PropertyType.IsValueType && targetProperty.PropertyType.GetGenericArguments().Length > 0 && typeof(Nullable<>).IsAssignableFrom(targetProperty.PropertyType.GetGenericTypeDefinition()))
                    {
                        type = type.GetGenericArguments()[0];
                    }
                    targetProperty.SetValue(target, Convert.ChangeType(value, type));
                }
            }
        }
    }
}

正如您所看到的,我使用SmartConventionInjection来加快速度。 映射16000个对象的时间大约需要20秒。这可以做得更快吗?

感谢

托马斯

1 个答案:

答案 0 :(得分:3)

使用ValueInjecter你会做这样的事情:

public class Um : ValueInjection
{
    protected override void Inject(object source, object target)
    {
        var node = target as Node;
        var props = source.GetProps();
        for (int i = 0; i < props.Count; i++)
        {
            var prop = props[i];
            target.GetProperty(prop.Name).Value;

        }
    }
}