在 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,如果它适合您的架构设计