gpt4 book ai didi

c# - 仅当值在运行时使用 Unity 为非空时,如何才能注入(inject)属性?

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:59 25 4
gpt4 key购买 nike

我有一个要解析的接口(interface),其中一个映射对象的依赖项上有一个属性,我想设置一个值,该值只有在解析顶级对象时才可用。

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

这种条件属性注入(inject)可能吗?

我试过了...

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

...但是它说我不能使用空值!

我也试过这个解决...

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

...但是当值为 null 时会抛出异常。它说,

Parameter type inference does not work for null values. Indicate the parameter type explicitly using a properly configured instance of the InjectionParameter or InjectionParameter classes. Parameter name: parameterValue

基本上,我希望注册一个仅使用覆盖设置的属性,并且仅当覆盖值不为空时才设置。有任何想法吗?当然,从语义的角度来看,属性注入(inject)应该是可选的。

干杯,伊恩。

最佳答案

此问题的一个潜在修复方法是实现 Null Object Pattern并在没有有效帐户时传递 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<ProductInstanceValidatorBase>(new PropertyOverride("AccountEntity", account));

这样帐户永远不会null, Entity Framework 也不会提示。

不过,我感觉您的系统设计可能存在更大的问题。 IoC 容器允许更松散耦合的系统,其中组件的连接是在程序运行之前定义的,而不是运行时定义的。从名称上看,AccountEnyity 是一个实体类,而不是服务类,您通常向 IoC 容器注册实体,只注册服务。

鉴于上述情况,我建议 AccountEntity 不应是可注入(inject)属性,而应是普通属性。然后,您将 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<IProductInstanceValidatorFactory>().Create(account);

关于c# - 仅当值在运行时使用 Unity 为非空时,如何才能注入(inject)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com