C# 从Windsor容器解析需要数据模型依赖项的对象

C# 从Windsor容器解析需要数据模型依赖项的对象,c#,dependency-injection,inversion-of-control,castle-windsor,C#,Dependency Injection,Inversion Of Control,Castle Windsor,我有一个AccountViewModel对象,它的构造函数中需要两个参数:在WindsorContainer中注册的DataStore对象和Account数据模型对象 现在,当用户在帐户列表中选择帐户时,我需要使用所选帐户从容器中解析AccountViewModel对象 但问题是该帐户未在容器中注册,当我在SelectionChanged事件中注册它时,我遇到了重复的注册错误 我还研究了每个依赖项的各种生命周期,但我仍然无法找到解决方案(我显然是使用IoC框架的初学者,因为我更喜欢自己的工厂类)

我有一个
AccountViewModel
对象,它的构造函数中需要两个参数:在
WindsorContainer
中注册的
DataStore
对象和
Account
数据模型对象

现在,当用户在帐户列表中选择帐户时,我需要使用所选帐户从容器中解析
AccountViewModel
对象

但问题是该帐户未在容器中注册,当我在
SelectionChanged
事件中注册它时,我遇到了重复的注册错误


我还研究了每个依赖项的各种生命周期,但我仍然无法找到解决方案(我显然是使用IoC框架的初学者,因为我更喜欢自己的工厂类)。

从构造函数中排除数据对象,并通过初始化方法传递数据

public class AccountModel
{
    public int Id { get; set; }
    // some more properties
}

public interface IAccountService
{
    Task<AccountModel> GetByIdAsync(int id);
}

public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService)
    {
        AccountService = accountService;
    }

    protected IAccountService AccountService { get; }

    private Task LoadFromModelAsync(AccountModel model)
    {
        Id = model.Id;
        _originalModel = model;
        return Task.CompletedTask;
    }

    private AccountModel _originalModel;
    public int Id { get; private set; }

    public async Task InitializeAsync(object parameter)
    {
        switch (parameter)
        {
            case null:
                await LoadFromModelAsync(new AccountModel());
                break;
            case int id:
                {
                    var model = await AccountService.GetByIdAsync(id);
                    await LoadFromModelAsync(model);
                    break;
                }
            case AccountModel model:
                await LoadFromModelAsync(model);
                break;
            default:
                throw new InvalidOperationException();
        }
    }
}
公共类AccountModel
{
公共int Id{get;set;}
//更多属性
}
公共接口服务
{
任务GetByIdAsync(int-id);
}
公共类AccountViewModel
{
公共帐户视图模型(IAccountService accountService)
{
AccountService=AccountService;
}
受保护的IAccountService帐户服务{get;}
私有任务LoadFromModelAsync(AccountModel模型)
{
Id=model.Id;
_原始模型=模型;
返回Task.CompletedTask;
}
私人账户模型(原始模型);
public int Id{get;private set;}
公共异步任务InitializeAsync(对象参数)
{
开关(参数)
{
大小写为空:
等待LoadFromModelAsync(新AccountModel());
打破
案例int id:
{
var模型=等待AccountService.GetByIdAsync(id);
等待LoadFromModelAsync(模型);
打破
}
案例模型:
等待LoadFromModelAsync(模型);
打破
违约:
抛出新的InvalidOperationException();
}
}
}

从构造函数中排除数据对象,并通过初始化方法传递数据

public class AccountModel
{
    public int Id { get; set; }
    // some more properties
}

public interface IAccountService
{
    Task<AccountModel> GetByIdAsync(int id);
}

public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService)
    {
        AccountService = accountService;
    }

    protected IAccountService AccountService { get; }

    private Task LoadFromModelAsync(AccountModel model)
    {
        Id = model.Id;
        _originalModel = model;
        return Task.CompletedTask;
    }

    private AccountModel _originalModel;
    public int Id { get; private set; }

    public async Task InitializeAsync(object parameter)
    {
        switch (parameter)
        {
            case null:
                await LoadFromModelAsync(new AccountModel());
                break;
            case int id:
                {
                    var model = await AccountService.GetByIdAsync(id);
                    await LoadFromModelAsync(model);
                    break;
                }
            case AccountModel model:
                await LoadFromModelAsync(model);
                break;
            default:
                throw new InvalidOperationException();
        }
    }
}
公共类AccountModel
{
公共int Id{get;set;}
//更多属性
}
公共接口服务
{
任务GetByIdAsync(int-id);
}
公共类AccountViewModel
{
公共帐户视图模型(IAccountService accountService)
{
AccountService=AccountService;
}
受保护的IAccountService帐户服务{get;}
私有任务LoadFromModelAsync(AccountModel模型)
{
Id=model.Id;
_原始模型=模型;
返回Task.CompletedTask;
}
私人账户模型(原始模型);
public int Id{get;private set;}
公共异步任务InitializeAsync(对象参数)
{
开关(参数)
{
大小写为空:
等待LoadFromModelAsync(新AccountModel());
打破
案例int id:
{
var模型=等待AccountService.GetByIdAsync(id);
等待LoadFromModelAsync(模型);
打破
}
案例模型:
等待LoadFromModelAsync(模型);
打破
违约:
抛出新的InvalidOperationException();
}
}
}

保持
AccountViewModel
不变,但:

然后,您可以实现(并向DI容器注册)工厂,如下所示:

public class AccountViewModelFactory : IAccountViewModelFactory
{
    public AccountViewModelFactory(IAccountService accountService)
    {
        AccountService = accountService;
    }

    public IAccountService AccountService { get; }

    public AccountViewModel Create(AccountModel model)
    {
        return new AccountViewModel(AccountService, model);
    }
}
public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService, AccountModel model)
    {
        AccountService = accountService;
        Model = model;
    }

    public IAccountService AccountService { get; }
    public AccountModel Model { get; }
}
假设
AccountViewModel
如下所示:

public class AccountViewModelFactory : IAccountViewModelFactory
{
    public AccountViewModelFactory(IAccountService accountService)
    {
        AccountService = accountService;
    }

    public IAccountService AccountService { get; }

    public AccountViewModel Create(AccountModel model)
    {
        return new AccountViewModel(AccountService, model);
    }
}
public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService, AccountModel model)
    {
        AccountService = accountService;
        Model = model;
    }

    public IAccountService AccountService { get; }
    public AccountModel Model { get; }
}

保持
AccountViewModel
不变,但:

然后,您可以实现(并向DI容器注册)工厂,如下所示:

public class AccountViewModelFactory : IAccountViewModelFactory
{
    public AccountViewModelFactory(IAccountService accountService)
    {
        AccountService = accountService;
    }

    public IAccountService AccountService { get; }

    public AccountViewModel Create(AccountModel model)
    {
        return new AccountViewModel(AccountService, model);
    }
}
public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService, AccountModel model)
    {
        AccountService = accountService;
        Model = model;
    }

    public IAccountService AccountService { get; }
    public AccountModel Model { get; }
}
假设
AccountViewModel
如下所示:

public class AccountViewModelFactory : IAccountViewModelFactory
{
    public AccountViewModelFactory(IAccountService accountService)
    {
        AccountService = accountService;
    }

    public IAccountService AccountService { get; }

    public AccountViewModel Create(AccountModel model)
    {
        return new AccountViewModel(AccountService, model);
    }
}
public class AccountViewModel
{
    public AccountViewModel(IAccountService accountService, AccountModel model)
    {
        AccountService = accountService;
        Model = model;
    }

    public IAccountService AccountService { get; }
    public AccountModel Model { get; }
}