【问题标题】:Autofac, Users and LoggingAutofac、用户和日志记录
【发布时间】:2017-07-20 09:49:47
【问题描述】:

我在我的项目中使用 Autofac 并且在大多数情况下它工作正常。不久前,我需要访问当前用户,并被告知最好的方法是创建一个这样的包装类:

public class PrincipalProvider : IPrincipalProvider
{
    public IPrincipal User => HttpContext.Current?.User;
}

这通过我的应用程序没有任何问题。 我现在有一个看起来像这样的新提供程序:

public class WmsProvider : IWmsProvider
{
    private readonly Lazy<ILogProvider> _logProvider;
    private readonly Lazy<IMessageProvider> _messageProvider;

    private readonly CormarConfig _config;
    private readonly ClaimsIdentity _identity;

    public WmsProvider(IPrincipalProvider principalProvider, Lazy<ILogProvider> logProvider, Lazy<IMessageProvider> messageProvider)
    {
        _messageProvider = messageProvider;
        _logProvider = logProvider;

        _identity = (ClaimsIdentity)principalProvider.User.Identity;
    }

    /// <summary>
    /// Sends the order to WMS
    /// </summary>
    /// <param name="model">The order model</param>
    public async Task SendAsync(OrderViewModel model)
    {
        var request = WmsFactory.Create(model);
        await _logProvider.Value.TraceAsync($"This is a test", _identity);
        await _messageProvider.Value.CreateAsync(request, model.OrderNumber, MessageType.Wms, "ORD", Method.POST, null);
    }
}

(为简洁起见,我删除了其余代码)

在这种情况下,User 为 null 并引发错误(找不到对象实例)。 但我有另一个具有类似构造函数的类:

    public OrderProvider(CormarConfig config, IOrderService orderSerivce, IPrincipalProvider principalProvider, Lazy<IAccountProvider> accountProvider, Lazy<ICollectionManagerProvider> collectionManagerProvider, Lazy<IEmailProvider> emailProvider, Lazy<IJournalProvider> journalProvider, Lazy<IOrderLineProvider> orderLineProvider, Lazy<IStockProvider> stockProvider, Lazy<webServices> webService, Lazy<ITroposOrderLineService> troposOrderLineService, Lazy<ITroposOrderService> troposOrderService, Lazy<ITroposUnitOfWork> troposUnitOfWork, Lazy<IWmsProvider> wmsProvider)
    {
        //Assign our config
        _config = config;

        // Add our services to our class
        _connectionType = config.ConnectionType;
        _orderService = orderSerivce;

        // Add our providers to our class
        _identity = (ClaimsIdentity)principalProvider.User.Identity;

        // Add our optional providers
        _accountProvider = accountProvider;
        _collectionManagerProvider = collectionManagerProvider;
        _emailProvider = emailProvider;
        _journalProvider = journalProvider;
        _orderLineProvider = orderLineProvider;
        _stockProvider = stockProvider;
        _webService = webService;
        _wmsProvider = wmsProvider;
        _troposOrderLineService = troposOrderLineService;
        _troposOrderService = troposOrderService;
        _troposUnitOfWork = troposUnitOfWork;
    }

这很好用。 两者在我的模块中的注册方式相同:

builder.RegisterType<OrderProvider>().As<IOrderProvider>().InstancePerRequest();
builder.RegisterType<WmsProvider>().As<IWmsProvider>().InstancePerRequest();

builder.RegisterType<PrincipalProvider>().As<IPrincipalProvider>();

需要注意的是,WmsProvider是被注入到OrderProvider中的,所以并不是直接注入到控制器中的。控制器构造函数如下所示:

public OrdersController(IOrderProvider provider)
{
    _provider = provider;
}

这可能是问题所在。在依赖项中,上下文是否不可用?如果不是,解决办法是什么?有没有办法从孩子那里获得上下文?

任何帮助将不胜感激。

【问题讨论】:

  • In this case, the User is null and throws an error (Object instance not found). 哪一行会抛出该异常?该异常的类型是什么?

标签: c# autofac principal


【解决方案1】:

我想通了。正如我所说,嵌套类中没有 context,所以为了解决这个问题,我将 PrincipalProvider 的注册更改为每个请求的实例:

builder.RegisterType<PrincipalProvider>().As<IPrincipalProvider>().InstancePerRequest();

我将 PrincipalProvider 更改为如下所示:

public class PrincipalProvider : IPrincipalProvider
{

    // Readonly fields
    private readonly HttpContext _current;

    /// <summary>
    /// Default constructor
    /// </summary>
    public PrincipalProvider()
    {
        _current = HttpContext.Current;
    }

    /// <summary>
    /// Gets the current user
    /// </summary>
    public IPrincipal User => _current?.User;
}

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2023-03-11
    • 1970-01-01
    • 2011-01-28
    • 2012-12-16
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多