在boosterapper(caliburn.micro)中正确实现autofac

问题描述 投票:0回答:1

我想使用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。

c# autofac caliburn.micro bootstrapper
1个回答
0
投票

您可以尝试使用

var employeeViewModel = IoC.Get<EmployeeViewModel>();
…
public void OpenEmployeeView() => _windowManager.ShowWindow(employeeViewModel);

使用注入的构造函数参数获取EmployeeViewModel的实例另一种选择是将EmployeeViewModel注入CalendarViewModel(如果适合您的架构)>

© www.soinside.com 2019 - 2024. All rights reserved.