在 boostrapper (caliburn.micro) 中正确实现 autofac
Implement autofac in boostrapper (caliburn.micro) correctly
我想使用 Caliburn.Micro 和引导程序重新编写我的第一个 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,包括。看起来像这样的引导程序(我想保留 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?很确定我的方法不是正确的方法:/
快速总结:
(bootstrapper) --application start--> (CalendarViewModel) --menu item--> (EmployeeViewModel)
2019 年 10 月 29 日更新:
行
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
抛出一个错误。我猜是因为我的 OpenCommand
public void OpenEmployeeView() => _windowManager.ShowWindow(new EmployeeViewModel());
不会将任何 IEmployeeRepository 传递到我的 EmployeeViewModel。
2019 年 10 月 29 日更新第 2 期:
新错误消息
System.InvalidOperationException: "A parameterless default constructor
or one matching signature (System.Int64 Id, System.String FirstName)
is required for Calendar.Database.Entities.EmployeeEntity
materialization"
被扔在里面
SqlRepository.cs(GetAll return 行抛出错误)
protected SqlRepository(IDbContext dbContext)
{
DbContext = dbContext;
}
public IList<TEntity> GetAll()
{
return DbContext.Connection.GetAll<TEntity>().ToList();
}
我做了什么:
Bootstrapper.cs
builder.RegisterType<EmployeeViewModel>()
.SingleInstance();
builder.RegisterType<DbContext>().As<IDbContext>()
.InstancePerLifetimeScope();
builder.RegisterType<EmployeeRepository>().As<IEmployeeRepository>()
.InstancePerLifetimeScope();
CalendarViewModel.cs
public void OpenEmployeeView() => _windowManager.ShowWindow(IoC.Get<EmployeeViewModel>());
EmployeeViewModel.cs
private readonly IEmployeeRepository _emp;
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
public ObservableCollection<EmployeeEntity> Employees
{
get
{
_Employees = _emp.GetAll().ToObservable();
return _Employees;
}
set
{
_Employees = value;
}
}
(我可以 post 一个 link 到我的 Visual Studio 项目......但不知道这里是否允许)
你可以尝试使用
var employeeViewModel = IoC.Get<EmployeeViewModel>();
…
public void OpenEmployeeView() => _windowManager.ShowWindow(employeeViewModel);
使用注入的构造函数参数获取 EmployeeViewModel
的实例。
另一个选项是将 EmployeeViewModel
注入 CalendarViewModel
,如果它适合您的架构设计
我想使用 Caliburn.Micro 和引导程序重新编写我的第一个 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,包括。看起来像这样的引导程序(我想保留 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?很确定我的方法不是正确的方法:/
快速总结: (bootstrapper) --application start--> (CalendarViewModel) --menu item--> (EmployeeViewModel)
2019 年 10 月 29 日更新: 行
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
抛出一个错误。我猜是因为我的 OpenCommand
public void OpenEmployeeView() => _windowManager.ShowWindow(new EmployeeViewModel());
不会将任何 IEmployeeRepository 传递到我的 EmployeeViewModel。
2019 年 10 月 29 日更新第 2 期: 新错误消息
System.InvalidOperationException: "A parameterless default constructor or one matching signature (System.Int64 Id, System.String FirstName) is required for Calendar.Database.Entities.EmployeeEntity materialization"
被扔在里面 SqlRepository.cs(GetAll return 行抛出错误)
protected SqlRepository(IDbContext dbContext)
{
DbContext = dbContext;
}
public IList<TEntity> GetAll()
{
return DbContext.Connection.GetAll<TEntity>().ToList();
}
我做了什么: Bootstrapper.cs
builder.RegisterType<EmployeeViewModel>()
.SingleInstance();
builder.RegisterType<DbContext>().As<IDbContext>()
.InstancePerLifetimeScope();
builder.RegisterType<EmployeeRepository>().As<IEmployeeRepository>()
.InstancePerLifetimeScope();
CalendarViewModel.cs
public void OpenEmployeeView() => _windowManager.ShowWindow(IoC.Get<EmployeeViewModel>());
EmployeeViewModel.cs
private readonly IEmployeeRepository _emp;
public EmployeeViewModel(IEmployeeRepository Emp)
{
_emp = Emp;
}
public ObservableCollection<EmployeeEntity> Employees
{
get
{
_Employees = _emp.GetAll().ToObservable();
return _Employees;
}
set
{
_Employees = value;
}
}
(我可以 post 一个 link 到我的 Visual Studio 项目......但不知道这里是否允许)
你可以尝试使用
var employeeViewModel = IoC.Get<EmployeeViewModel>();
…
public void OpenEmployeeView() => _windowManager.ShowWindow(employeeViewModel);
使用注入的构造函数参数获取 EmployeeViewModel
的实例。
另一个选项是将 EmployeeViewModel
注入 CalendarViewModel
,如果它适合您的架构设计