只有在使用Unity的运行时值为非null时,如何注入属性?

我有一个要解析的接口,其中一个映射对象的依赖项有一个属性,我想设置一个值,当我解析顶级对象时,我只能使用它。

该属性没有有效的默认值。 如果未设置,则它应为null,并且只有在解析时可用的值不为空时才应设置它。

这种有条件的财产注入可能吗?

我试过这个……

container.RegisterType("CartItemPurchaseTypeValidator", new InjectionProperty("AccountEntity", null); 

…但它说我不能使用空值!

我也试过这个决心……

 container.Resolve(new PropertyOverride("AccountEntity", value)); 

…但是当值为null时抛出exception。 它说,

参数类型推断不适用于空值。 使用正确配置的InjectionParameter或InjectionParameter类实例显式指示参数类型。 参数名称:parameterValue

基本上我想要注册一个仅使用覆盖设置的属性,然后仅在覆盖值为非null时才注册。 有任何想法吗? 当然,从语义的角度来看,属性注入应该是可选的。

干杯,伊恩。

解决此问题的一个可能方法是在没有有效Account.Empty时实现Null对象模式并传递Account.Empty 。 这是一个类可能是什么样子:

 public class Account { public static readonly Account Empty = new Account(); } //at resolution time Account account = null; if (HasAccount) account = GetAccount(); else account = Account.Empty; container.Resolve(new PropertyOverride("AccountEntity", account)); 

这样,帐户永远不会为null ,entity framework也不会抱怨。

但是我觉得你可能在系统设计上遇到更大的问题。 IoC容器允许更松散耦合的系统,其中组件的布线在程序运行之前定义, 不是在运行时定义。 根据名称判断, AccountEnyity是一个实体类,而不是服务类,您通常不会向IoC容器注册实体,只注册服务。

鉴于上述情况,我建议AccountEntity不应该是一个可注射的属性,而是一个普通的属性。 然后,将ProductInstanceValidatorBase创建外部化到工厂中,让它负责设置AccountEntity属性

 public interface IProductInstanceValidatorFactory{ ProductInstanceValidatorBase Create(Account account); } public class ProductInstanceValidatorFactory : IProductInstanceValidatorFactory{ public ProductInstanceValidatorBase Create(Account account){ var validator = new ProductInstanceValidator(); validator.AccountEnity = account; return validator; } } 

您甚至不需要在Unity中注册ProductInstanceValidatorBase ,而是注册工厂。 这是使用工厂的样子:

 Account account = null; container.Resolve().Create(account); 

您可以将InjectionParameter与空值一起使用,但必须指定类型。 对于您的两个场景,我假设您的AccountEntity参数是类型或从IAccount派生:

 container.RegisterType("CartItemPurchaseTypeValidator", new InjectionProperty(null); 

请注意,我删除了名称,因为在上面的场景中并不是特别需要,但下面的场景需要它。

 container.Resolve(new PropertyOverride("AccountEntity", new InjectionProperty(null))); 

我倾向于同意伊戈尔。 但是,如果您绝对必须解析Entity ,为什么不将您的IoC容器作为构造函数依赖项,然后尝试在构造函数中Resolve