.net 使用DRYIOC注册类并获取返回模型的实例
我想使用DryIoc在userviewmodel中注册并获取当前用户的实例。请说明如何实现这一点。这是CurrentUserConfig类.net 使用DRYIOC注册类并获取返回模型的实例,.net,inversion-of-control,dryioc,.net,Inversion Of Control,Dryioc,我想使用DryIoc在userviewmodel中注册并获取当前用户的实例。请说明如何实现这一点。这是CurrentUserConfig类 public class CurrentUserConfig { private IContainer _container; private UserViewModel _userViewModel; public CurrentUserConfig(IContainer container) { _co
public class CurrentUserConfig
{
private IContainer _container;
private UserViewModel _userViewModel;
public CurrentUserConfig(IContainer container)
{
_container = container;
_userViewModel = new UserViewModel();
}
public UserViewModel GetCurrentUser()
{
if (!string.IsNullOrEmpty(Thread.CurrentPrincipal.Identity.Name) && Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
if (_userViewModel == null || _userViewModel.UserId < 1)
{
try
{
var repository = _container.Resolve<IUserRepository>();
_userViewModel = Task.Run(async () => await repository.GetUserByUsername(Thread.CurrentPrincipal.Identity.Name)).Result;
}
catch (System.Exception ex)
{
//return exception error;
}
}
}
return _userViewModel;
}
}
公共类CurrentUserConfig
{
私人集装箱;
私有用户视图模型_UserViewModel;
public CurrentUserConfig(IContainer容器)
{
_容器=容器;
_userViewModel=新的userViewModel();
}
公共用户视图模型GetCurrentUser()
{
如果(!string.IsNullOrEmpty(Thread.CurrentPrincipal.Identity.Name)&&Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
if(_userViewModel==null | |_userViewModel.UserId<1)
{
尝试
{
var repository=_container.Resolve();
_userViewModel=Task.Run(异步()=>await repository.GetUserByUsername(Thread.CurrentPrincipal.Identity.Name)).Result;
}
catch(System.Exception-ex)
{
//返回异常错误;
}
}
}
返回_userViewModel;
}
}
这就是我想用DryIoc实现的目标。这是使用SimpleInjector完成的
var currentUserConfig = new CurrentUserConfig(container);
container.RegisterSingleton(currentUserConfig);
container.Register<UserViewModel>(() =>
{
var objCurrentUserConfig = container.GetInstance<CurrentUserConfig>();
return currentUserConfig.GetCurrentUser();
}, Lifestyle.Scoped);
var currentUserConfig=new currentUserConfig(容器);
RegisterSingleton(currentUserConfig);
容器。寄存器(()=>
{
var objCurrentUserConfig=container.GetInstance();
返回currentUserConfig.GetCurrentUser();
},生活方式。范围);
直接翻译将是:
var currentUserConfig = new CurrentUserConfig(container);
container.UseInstance(currentUserConfig);
container.RegisterDelegate<UserViewModel>(resolver =>
{
var objCurrentUserConfig = resolver.Resolve<CurrentUserConfig>();
return currentUserConfig.GetCurrentUser();
}, Reuse.InCurrentScope);
为什么要解析
var repository=\u container.Resolve()
而不是将IUserRepository
注入CurrentUserConfig
?如果我将IUserRepository注入CurrentUserConfig,我会得到错误“在将UserViewModel解析为参数时检测到递归依赖性”用户“在CurrentUserConfig@dadhi中解析的缺点是什么?缺点是您依赖于方法中某个位置的容器作为服务定位器。对用户存储库的依赖性并不明显,这可能会隐藏bug并使事情变得不稳定。考虑到您的情况,当您将依赖项移动到曲面(使其成为参数)时,您确实发现依赖项是递归的。这可能是错误,也可能不是错误,但至少这并不令人惊讶。谢谢您的回复。我想我需要将IContainer的实例传递给CurrentUserConfig的构造函数。由于我没有解析我的IUserRepository,因此不再需要它。
container.Register<CurrentUserConfig>(Reuse.Singleton);
container.RegisterDelegate<UserViewModel>(resolver =>
{
var objCurrentUserConfig = resolver.Resolve<CurrentUserConfig>();
return currentUserConfig.GetCurrentUser();
}, Reuse.InCurrentScope);
container.Register<CurrentUserConfig>(Reuse.Singleton);
container.Register<UserViewModel>(
Made.Of(_ => ServiceInfo.Of<CurrentUserConfig>(), config => config.GetCurrentUser()),
Reuse.InCurrentScope);