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

Resolve an object from Windsor container that requires a data model dependency

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

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

但问题是账号没有在容器中注册,当我在SelectionChanged事件上注册时,我运行进入重复注册错误。

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

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

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

保持 AccountViewModel 不变,但 use a factory for dependency injection:

public interface IAccountViewModelFactory
{
    AccountViewModel Create(AccountModel model);
}

然后您可以像这样实施(并向您的 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);
    }
}

假设 AccountViewModel 看起来像这样:

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

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