【问题标题】:Autofac DI does not work as expected in Console ApplicationAutofac DI 在控制台应用程序中无法按预期工作
【发布时间】:2017-09-06 20:00:32
【问题描述】:

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

【问题讨论】:

  • 这里没有足够的信息来回答您的问题。我们不知道你们的班级都是做什么的。
  • DI例子中的“保存”代码在哪里?
  • 问题出现在“DataService”而不是“AutoFac”
  • 我仍然想指出,如果我初始化类,保存过程可以正常工作。当我使用依赖注入注入类时,保存过程不起作用。
  • @DavidG 我添加了基础设施类。您想查看任何其他信息或课程内容吗?

标签: c# console-application autofac


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多