解决从温莎容器中的对象,需要一个数据模型的依赖

问题描述 投票:0回答:2

我有这需要在其构造两个参数的AccountViewModel对象:在DataStore注册WindsorContainer对象和Account数据模型对象。

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

但问题是没有在容器中注册的帐号,当我注册它的SelectionChanged事件,我遇到了一个重复注册错误。

我还调查了不同的生命周期每个依存性,但我仍然无法找出一个解决方案(我显然在使用IoC框架,因为我更喜欢我自己的工厂类初学者)。

c# dependency-injection inversion-of-control castle-windsor
2个回答
2
投票

保持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; }
}

1
投票

排除从构造的数据对象,并且经由一个初始化方法传递数据。

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.