从需要数据模型依赖项的 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; }
}
我有一个 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; }
}