2017-09-06 41 views
0

我有一个控制台应用程序,Autofac DI用于从Web应用程序项目注入数据和服务层。Autofac DI在控制台应用程序中无法正常工作

这里是控制台应用程序的设置:

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和使用简单的类初始化的运行方法,下面的保存工作正常:在autofac

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

我失去的东西,而我的设置?它似乎访问数据正常,但是当它保存它不会保存数据。我调试看到任何问题,但程序运行正常,没有错误。我该如何调试这类问题才能找到更多细节?

更新

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

这里有没有足够的信息来回答你的问题。我们不知道你的班级都做了什么。 – DavidG

+0

DI示例中的“保存”代码在哪里? –

+0

这个问题似乎是在'DataService',而不是'AutoFac' – Dinny

回答

2

阅读autofac范围here

我发现默认范围是实例每依赖后。这意味着每个服务请求都会返回一个唯一的实例。 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(); 
    } 
} 
相关问题