Autofac DI在控制台应用程序中无法正常工作

时间:2017-09-06 09:25:24

标签: c# console-application autofac

我有一个控制台应用程序,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();
    }       
}

主程序类:

class Program
    {
        static void Main(string[] args)
        {
            var container = ContainerConfig.Configure();
            using (var scope = container.BeginLifetimeScope())
            {
                var app = scope.Resolve<IApplication>();
                app.Run();
            }
        }
    }

运行应用程序时,加载数据工作正常。但是,保存新条目似乎不起作用。

但是,当我删除DI并在Run方法中使用简单的类初始化时,保存工作正常:

        IDbFactory dbFactory = new DbFactory();
        IDataRepository dataRepository = new DataRepository(dbFactory);
        var unitOfWork = new UnitOfWork(dbFactory);
        IDataService service = new DataService(dataRepository, unitOfWork);
        var data = service.GetDataById(1);
        var task = new TestTask("test");
        data.AddTask(task);
        service.Update(data);
        service.SaveChanges();

我在设置autofac时错过了什么?它似乎可以很好地访问数据,但是当它保存时它不会保存数据。我调试看到任何问题,但程序运行正常,没有错误。如何调试此类问题以查找更多详细信息?

  

更新

    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();
    }
}

1 个答案:

答案 0 :(得分:2)

阅读autofac范围here

我发现默认范围是Instance Per Dependency。这意味着将从每个服务请求返回一个唯一的实例。 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();
    }
}