我想使用Caliburn.Micro和bootstrapper的东西重新编码我的第一个C#项目。在我的第一种方法中,我使用了Autofac,但现在遇到了麻烦。没有Caliburn,我可以从这样的db文件中检索我的员工(注意scope.resolve的东西-这就是我现在的问题):
public ObservableCollection<EmployeeEntity> Employees
{
get
{
var container = ContainerConfig.Configure();
using (var scope = container.BeginLifetimeScope())
{
var test = scope.Resolve<IEmployeeRepository>();
_Employees = test.GetAll().ToObservable();
}
return _Employees;
}
set
{
_Employees = value;
}
}
现在我切换到Caliburn.Micro incl。看起来像这样的引导程序(我想保留LifeTimeScope的东西)
protected override void Configure()
{
var builder = new ContainerBuilder();
builder.RegisterType<WindowManager>()
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterType<EventAggregator>()
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterType<CalendarViewModel>()
.SingleInstance();
builder.RegisterType<EmployeeViewModel>()
.SingleInstance();
builder.RegisterType<EmployeeRepository>().As<IEmployeeRepository>()
.InstancePerLifetimeScope();
Container = builder.Build();
}
在应用程序启动时,我打开“ CalendarViewModel”并获取相应的视图。我的视图包含一个菜单,该菜单在单击时使用以下实现打开第二个视图“ EmployeeViewModel”:
private readonly IWindowManager _windowManager;
public CalendarViewModel(IWindowManager WindowManager)
{
_windowManager = WindowManager;
}
public void OpenEmployeeView() => _windowManager.ShowWindow(new EmployeeViewModel());
现在,我的问题是如何使用引导程序以及带有“ Lifetimescope”的“ IEmployeeRepository”的实现,从一开始就将代码(仅适用于Autofac)更改并包含在工作代码中。
我尝试过的事情:
[我试图像使用WindowManager一样包含“ IEmployeeRepository”:
private ObservableCollection<EmployeeEntity> _Employees;
private readonly IEmployeeRepository _emp;
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
public ObservableCollection<EmployeeEntity> Employees
{
get
{
_Employees = _emp.GetAll().ToObservable();
return _Employees;
}
set
{
_Employees = value;
}
}
但是(您可能已经知道),我得到一个错误
CS7036 There is no argument given that corresponds to the required formal parameter
那么如何在Bootstrapper中正确实现Autofac?非常确定我的方法不是正确的方法:/
快速摘要:(引导程序)-应用程序启动->(CalendarViewModel)-菜单项->(EmployeeViewModel)
UPDATE 29.10.2019:行
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
引发错误。我猜是因为我的OpenCommand
public void OpenEmployeeView() => _windowManager.ShowWindow(new EmployeeViewModel());
不会将任何IEmployeeRepository传递给我的EmployeeViewModel。
您可以尝试使用
var employeeViewModel = IoC.Get<EmployeeViewModel>();
…
public void OpenEmployeeView() => _windowManager.ShowWindow(employeeViewModel);
使用注入的构造函数参数获取EmployeeViewModel
的实例另一种选择是将EmployeeViewModel
注入CalendarViewModel
(如果适合您的架构)>