C# Autofac DI在控制台应用程序中无法按预期工作

C# Autofac DI在控制台应用程序中无法按预期工作,c#,console-application,autofac,C#,Console Application,Autofac,我有一个控制台应用程序,Autofac DI用于从web应用程序项目注入数据和服务层 以下是控制台应用程序的设置: public static class ContainerConfig { public static IContainer Configure() { var builder = new ContainerBuilder(); builder.RegisterType<DbFactory>().As<IDbFa

我有一个控制台应用程序,Autofac DI用于从web应用程序项目注入数据和服务层

以下是控制台应用程序的设置:

public static class ContainerConfig
{

    public static IContainer Configure()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<DbFactory>().As<IDbFactory>();
        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
        builder.RegisterType<Application>().As<IApplication>();
        builder.RegisterType<DataRepository>().As<IDataRepository>();
        builder.RegisterType<DataService>().As<IDataService>();

        return builder.Build();
    }
}

public interface IApplication
{
    void Run();
}

public class Application : IApplication
{
    private readonly IDataService _dataService;


    public Application(IDataService dataService)
    {
        _dataService = dataService;
    }

    public void Run()
    {
        var data = _dataService.GetDataById(1);         
        var task = new TestTask("test");
        data.AddTask(task);
        _dataService.Update(data);
        _dataService.SaveChanges();
    }       
}
我在设置autofac时是否遗漏了什么?它似乎可以很好地访问数据,但在保存数据时却无法保存数据。我调试过以查看任何问题,但程序运行良好,没有错误。如何调试此类问题以找到更多详细信息

更新


读取autofac示波器后

我发现默认范围是每个依赖项的实例。这意味着每个服务请求将返回一个唯一的实例。DbFactory应用于InstancePerLifetimeScope

因此,更改以下配置可以解决此问题:

    public static class ContainerConfig
{

    public static IContainer Configure()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerLifetimeScope();
        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
        builder.RegisterType<Application>().As<IApplication>();
        builder.RegisterType<DataRepository>().As<IDataRepository>();
        builder.RegisterType<DataService>().As<IDataService>();

        return builder.Build();
    }
}
公共静态类容器配置
{
公共静态IContainer配置()
{
var builder=new ContainerBuilder();
builder.RegisterType();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
返回builder.Build();
}
}

读取autofac范围后

我发现默认范围是每个依赖项的实例。这意味着每个服务请求将返回一个唯一的实例。DbFactory应用于InstancePerLifetimeScope

因此,更改以下配置可以解决此问题:

    public static class ContainerConfig
{

    public static IContainer Configure()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerLifetimeScope();
        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
        builder.RegisterType<Application>().As<IApplication>();
        builder.RegisterType<DataRepository>().As<IDataRepository>();
        builder.RegisterType<DataService>().As<IDataService>();

        return builder.Build();
    }
}
公共静态类容器配置
{
公共静态IContainer配置()
{
var builder=new ContainerBuilder();
builder.RegisterType();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
返回builder.Build();
}
}

这里没有足够的信息来回答您的问题。我们不知道您的类都做什么。DI示例中的“保存”代码在哪里?问题似乎在“DataService”中,而不是在“AutoFac”中。我仍然想指出,如果我初始化类,保存过程工作正常。当我使用依赖注入注入类时,保存过程不起作用。@DavidG我添加了基础结构类。您还想看其他信息或课程内容吗?这里没有足够的信息来回答您的问题。我们不知道您的类都做什么。DI示例中的“保存”代码在哪里?问题似乎在“DataService”中,而不是在“AutoFac”中。我仍然想指出,如果我初始化类,保存过程工作正常。当我使用依赖注入注入类时,保存过程不起作用。@DavidG我添加了基础结构类。您还想看其他信息或课程内容吗?
    public interface IDataService
{
    void Add(TestTask task);
    void SaveChanges();
}

public class DataService : IDataService
{
    private readonly IDataRepository _dataRepository;
    private readonly IUnitOfWork _unitOfWork;

    public DataService(IDataRepository dataRepository, IUnitOfWork unitOfWork)
    {
        _dataRepository = dataRepository;
        _unitOfWork = unitOfWork;
    }

    public void Add(TestTask task)
    {
        _dataRepository.Add(task);
    }

    public void SaveChanges()
    {
        _unitOfWork.Commit();
    }
}

public class UnitOfWork : IUnitOfWork
{
    private readonly IDbFactory _dbFactory;
    private ApplicationDbContext _dbContext;

    public UnitOfWork(IDbFactory dbFactory)
    {
        this._dbFactory = dbFactory;
    }

    public ApplicationDbContext DbContext => _dbContext ?? (_dbContext = _dbFactory.Init());

    public void Commit()
    {
        DbContext.Commit();
    }
}
    public static class ContainerConfig
{

    public static IContainer Configure()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerLifetimeScope();
        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
        builder.RegisterType<Application>().As<IApplication>();
        builder.RegisterType<DataRepository>().As<IDataRepository>();
        builder.RegisterType<DataService>().As<IDataService>();

        return builder.Build();
    }
}