Разрешить объект из контейнера Windsor, который требует зависимости модели данных - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть объект AccountViewModel, для которого в конструкторе требуются два аргумента: объект DataStore, зарегистрированный в WindsorContainer, и объект модели данных Account.

Теперь, когда пользовательвыбирает учетную запись в списке учетных записей, мне нужно resolve объект AccountViewModel из контейнера, используя выбранную учетную запись.

Но проблема заключается в том, что учетная запись не зарегистрирована в контейнере, и когда язарегистрируйте его в событии SelectionChanged, я столкнулся с двойной ошибкой регистрации.

Я также исследовал различные жизненные циклы для каждой зависимости, но все еще не могу найти решение (я, очевидно, новичокв использовании фреймворков IoC, так как я предпочитаю свой собственный класс фабрики).

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Сохранить AccountViewModel как есть, но использовать фабрику для внедрения зависимостей :

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; }
}
0 голосов
/ 27 декабря 2018

Исключить объекты данных из конструктора и передать данные методом инициализации.

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...