3

我需要扩展 Omu.ValueInjecter 以在进行属性分配之前执行检查。给定下面的代码示例,只有在 SetA 为 true 时才应该分配 prop A。我怀疑 LoopValueInjection 不是正确的基类,但有人可以更正下面的代码,以便我可以在注入过程中检查 SetA 吗?

var source = new Source() { A = 3 };
var dest = new Dest();
dest.InjectFrom<MyInjector>(source);

public class Source
{
    public int A { get; set; }
    public bool SetA { get; set; }
}
public class Dest
{
    public int A { get; set; }
}

public class MyInjector : LoopValueInjection // or some other base class!
{
    protected override bool AllowSetValue(object value)
    {
        // check SetA!!
        //return base.AllowSetValue(value);
    }
}
4

3 回答 3

2

好的,我现在可以工作了。下面是正确的代码。我错过了正好符合我的目的的 UseSourceProp 重载。

我试图解决的问题是在将视图模型发布到操作后使用 MVC,您必须将视图模型数据复制到数据模型中。初始化数据模型时,可能会设置某些默认值。当视图模型被注入时,这些默认值将被覆盖。如果已设置视图模型属性,则覆盖它们是正确的,但我的默认值被未从后期操作设置的视图模型值覆盖。

解决方案是在视图模型中放置一个标志,指示是否设置了属性。每个属性的设置器我只是更新了基类中的一个通用列表字符串对象。

在UseSourceProp方法下面的代码中可以看到,如果SetProperties中不存在正在处理的属性名,那么该方法返回false,并且该属性没有被设置。

var source = new Source() { A = 3 };
var dest = new Dest();
dest.InjectFrom<MyInjector>(source);

public class Source
{
    public int A { get; set; }
    public bool SetA { get; set; }
}
public class Dest
{
    public int A { get; set; }
}

public class MyInjector : LoopValueInjection // or some other base class!
{
    protected override void Inject(object source, object target)
    {
        if (source is BaseEntityViewModel) _baseEntityViewModel = (BaseEntityViewModel)source;
        base.Inject(source, target);
    }
    protected override bool UseSourceProp(string sourcePropName)
    {
        if (_baseEntityViewModel is BaseEntityViewModel)
            return _baseEntityViewModel.SetProperties.Contains(sourcePropName);
        else
            return base.UseSourceProp(sourcePropName);
    }
}
于 2014-01-30T17:49:57.237 回答
1

我认为覆盖该SetValue方法可能是您需要的。这是对此处文档的轻微修改:http: //valueinjecter.codeplex.com/wikipage ?title=Getting%20started&referringTitle=Documentation和http://valueinjecter.codeplex.com/discussions/355101

public class MyInjector : LoopValueInjection
{       
    //by default is return sourcePropertyValue; override to change behaviour 
    protected override object SetValue(ConventionInfo c)
    {
        // this is just a sample, but you could write anything here
        return new Dest 
        { 
            //Check if source value is true and only then set property

            if(c.SourceProp.Name == "SetA")
            {
              var setASourceVal = c.TargetProp.Value As bool;
              if(setASourceVal)
              {
                A = sourcePropertyValue;
              }
            }
        }
    }
}
于 2014-01-30T14:46:01.683 回答
0

取决于您使用哪种注入,使用 ConventionInjection,您可以在 Match 方法中获得值 https://valueinjecter.codeplex.com/wikipage?title=step%20by%20step%20explanation&referringTitle=Home

对于 LoopValueInjection 你可以覆盖AllowSetValue

最新(最快)的注入是这样的:https ://valueinjecter.codeplex.com/wikipage?title=SmartConventionInjection&referringTitle=Home

与 ConventionInjection 相比,它有一个限制,在 Match 方法中没有 Source 和 Target 属性的值,但在 SetValue 方法中有它们,如果设置为 false,则可以取消对该属性的值设置到 ref 参数 setValue

于 2014-01-31T09:29:56.823 回答