调用BindingResolver的Update方法时是否会自动创建嵌套属性对象?
关于MORYX框架中BindingResolverFactory的属性绑定问题
我在自定义模块配置中使用BindingResolverFactory实现属性绑定,绑定的对象完全由给定的绑定规则生成,所有绑定属性都设置为字符串'example'。
需要创建的对象类型定义如下:
public class Foo { public string FooString { get; set; } public Bar FooBar { get; set; } } public class Bar { public string BarString { get; set; } }
在ModuleController的Start()方法中,我为配置的两个绑定(FooString和FooBar.BarString)创建了IBindingResolver实例:
// Somewhere var resolverFactory = new BindingResolverFactory(); var fooStringResolver = resolverFactory.Create("FooString"); var barStringResolver = resolverFactory.Create("FooBar.BarString");
现在我创建了Foo类型的实例:
var foo = new Foo(); fooStringResolver.Update(foo, "example"); barStringResolver.Update(foo, "example"); // 此代码能否生效?
请问:
- 我能否让resolver自动处理
Bar对象是否已创建,还是需要手动提前创建? - 若没有绑定指向
FooBar属性,我需要它保持null,否则就得先创建再删除,这会很繁琐,有没有办法避免?
答案
1. barStringResolver.Update(foo, "example")的生效情况
默认情况下这段代码不会生效,因为foo.FooBar初始为null,原生的BindingResolver不会自动创建嵌套对象实例。
2. 自动处理嵌套对象创建的方案
你可以通过配置BindingResolverFactory的ObjectFactory扩展点,实现自动创建未初始化的嵌套对象:
var resolverFactory = new BindingResolverFactory(); // 配置自动创建嵌套对象的逻辑 resolverFactory.ObjectFactory = (type) => Activator.CreateInstance(type); var barStringResolver = resolverFactory.Create("FooBar.BarString"); var foo = new Foo(); barStringResolver.Update(foo, "example"); // 此时foo.FooBar会被自动实例化,且FooBar.BarString会被设置为"example"
3. 无绑定时保持FooBar为null的实现
上述配置只会在有绑定指向嵌套属性(比如FooBar.BarString)时,才会自动创建Bar实例。如果没有任何绑定涉及FooBar,foo.FooBar会保持初始的null状态,完全不需要提前创建再删除的操作。
内容的提问来源于stack exchange,提问作者1nf0rmagician
相关产品推荐
相关产品推荐

