我可以在asp.net 5中的单例实例中解析范围实例

mrp*_*nut 5 c# dependency-injection asp.net-core

我一直在使用一个技巧来帮助维护审计跟踪.在控制器中或之前,我创建了一个User以某种方式绑定到请求的域.我可以使用DI创建我的大部分应用程序作为单例,我可以Func<User>在我认为需要User信息的任何地方注入.我从Func获得了每个请求用户,并且可以轻松地将审计信息添加到所有内容中.

这使我的域类User不可知,并让我的DI容器充当User管理系统.

现在我正在使用asp.net 5,我在做同样的事情时遇到了麻烦.老实说,我从来没有想过我应该能做到这一点,但我已经习惯了.

我正在尝试做这样的事情:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddScoped<IUser, User>();
    services.AddSingleton<IDependantOnUser, DependantOnUser>
    services.AddScoped<Func<IUser>(c => c.GetRequiredService<IUser>);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器之前或之前,我创建并填充用户实例.

public class ValuesController : Controller
{
    public ValuesController(Func<User> userFunc)
    {
        user = userFunc();
        // hydrate user instance as needed
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我应该可以访问我的singleton对象中的用户实例.

public class DependantOnUser : IDependantOnUser
{
    public DependantOnUser(Func<User> userFunc)
    {
        user = userFunc();
        // I want this to be the same instance as that generated by the controller
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不能让这个工作.在asp.net 5之前,我一直在使用Autofac来实现这一目标,但那里没有运气.我尝试过使用transient/scoped/singleton,但没有运气.我甚至尝试过解析我自己IServiceProvider并直接使用它,而不仅仅是生成一个用户c => c.GetRequiredService<IUser>

我做的每件事似乎都在使用错误的IServiceProvider实例.有没有办法解决不同的实例ServiceProvider?任何其他建议也会有所帮助.

在你建议我只是注册所有内容之前AddScoped(),我的演示文稿和持久层之间的一些对象作为单身人士工作得更好.

此外,我不希望仅将User信息作为参数传递给我的域中的每个方法(我们几乎每个CRUD操作都会记录它,并通过我们制作的大多数外部调用传递它)

小智 -1

我认为将作用域依赖注入到单例中是反模式,请参阅 Captive Dependencies Autofac Captive Dependencies