我一直在使用技巧来帮助维护审计跟踪。在控制器中或之前,我创建了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>);
}
然后在我的控制器之前或之前,我创建并填充用户实例。
public class ValuesController : Controller
{
public ValuesController(Func<User> userFunc)
{
user = userFunc();
// hydrate user instance as needed
}
}
最后,我应该可以访问我的单例对象中的用户实例。
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
}
}
但我不能让这个工作。在asp.net 5之前,我一直在使用Autofac来实现这一目标,但那里没有运气。我尝试过使用transient / scoped / singleton,但没有运气。我甚至尝试过解析自己的IServiceProvider
并直接使用它,而不仅仅是生成c => c.GetRequiredService<IUser>
的用户
我所做的一切似乎都在使用错误的IServiceProvider
实例。有没有办法解决来自不同ServiceProvider
的实例?任何其他建议也会有所帮助。
在你建议我只使用AddScoped()
注册所有内容之前,我的演示文稿和持久层之间的一些对象作为单身人士的效果要好得多。
此外,我不希望仅将User
信息作为参数传递给我的域中的每个方法(我们几乎每次CRUD操作都会记录它,并通过我们制作的大多数外部调用传递它)