.net 使用DRYIOC注册类并获取返回模型的实例

.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

我想使用DryIoc在userviewmodel中注册并获取当前用户的实例。请说明如何实现这一点。这是CurrentUserConfig类

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);