gpt4 book ai didi

c# - AutoFac:注入(inject) NULL 值

转载 作者:太空狗 更新时间:2023-10-29 18:24:28 27 4
gpt4 key购买 nike

我想使用 AutoFac 将当前委托(delegate)人注入(inject)到需要它的对象中。假设我有一个执行安全检查的对象 (AuthorizationValidator)。它看起来像这样:

public AuthorizationValidator : IAuthorizationValidator
{
public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal)
{
// Save injected objects
...
}

public bool CheckPermission(Guid objectId, Action action)
{
// Check if we are authorized at all
if (this.principal == null)
return false;

// Check the permission in the database
...
}
}

对于我的 Web 应用程序,AuthorizationValidator 已注册,我使用以下注册来注入(inject)主体:

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User);

其他类型的应用程序使用线程的主体或类似的东西。所有需要委托(delegate)人的对象都得到适当的委托(delegate)人注入(inject)。

如果在未经授权的情况下进行调用,AutoFac 会引发异常,告诉我它无法提供 IPrincipal 对象,因为工厂返回了 null。在这种情况下,空委托(delegate)人是可以的,不应引发异常。

最佳答案

在 Autofac documentation他们建议使用 Null Object pattern对于这样的场景。您可以创建一个 NullPrincipal 类,该类继承自 IPrincipal 接口(interface),带有一个仅公开 readonly static 的私有(private)构造函数提供默认实例的字段。然后你可以返回这个实例而不是 null:

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User ?? NullPrincipal.Default);

当然,您必须更新代码中检查主体是否为 null 的所有位置,并改为检查它是否等于 NullPrincipal.Default

关于c# - AutoFac:注入(inject) NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38476803/

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