我正在反序列化这样的类
class AClass{
[Dependency]
AnotherClass Property{ get; set; }
}
当我使用 BuildUp() 对象时,我希望 Unity 仅在属性为 null 时创建 AnotherClass 的新实例,否则仅对其执行 BuildUp。
有没有一种简单的方法可以实现这一目标?
编辑:我正在用 wpf 做 mvvm 。这些类是视图模型,我将它们序列化,因为我想在运行之间保留一些属性,并且它们还有一些我想要统一注入的依赖项。因此,在反序列化之后,嵌套模型已经存在并设置了属性,因此我不希望 Unity 用新实例覆盖它,但我仍然希望它在其上调用 InjectionMethods 并在程序第一次运行时正常解析它,嵌套模型为空。
我最终写了一个统一扩展。
我找不到太多关于如何执行此操作的文档,所以我不太确定结果。
它似乎有效,但我有这种感觉我可能写了一些可怕的东西..
无论如何,这是代码,欢迎改进:
public class RecursiveBuildUpContainerExtension : UnityContainerExtension {
protected override void Initialize(){
Context.Strategies.Add( new RecursiveBuildUpBuilderStrategy( Context.Container ), UnityBuildStage.PreCreation );
}
}
public class RecursiveBuildUpBuilderStrategy : BuilderStrategy {
readonly IUnityContainer container;
public RecursiveBuildUpBuilderStrategy( IUnityContainer container ) {
this.container = container;
}
public override void PreBuildUp( IBuilderContext context ) {
if( context.Existing == null ) return;
foreach( var prop in context.Existing.GetType( ).GetProperties( ) ) {
if( ContainsType<DependencyAttribute>( prop.GetCustomAttributes( true ) ) ) {
if( prop.GetValue( context.Existing, null ) == null ) {
var value = container.Resolve( prop.PropertyType );
prop.GetSetMethod( ).Invoke( context.Existing, new[] { value } );
}
else {
var value = container.BuildUp( prop.PropertyType, prop.GetValue( context.Existing, null ) );
prop.GetSetMethod( ).Invoke( context.Existing, new[] { value } );
}
}
}
foreach (var method in context.Existing.GetType().GetMethods() ){
if( ContainsType<InjectionMethodAttribute>( method.GetCustomAttributes( true ))){
var argsInfo = method.GetParameters( );
var args = new object[argsInfo.Length];
for( int i = 0; i < argsInfo.Length; i++ ) {
args[i] = container.Resolve( argsInfo[i].ParameterType );
}
method.Invoke( context.Existing, args );
}
}
context.BuildComplete = true;
}
private static bool ContainsType<T>( IEnumerable<object> objects ){
foreach (var o in objects){
if( o is T ) return true;
}
return false;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)