2017-09-06 72 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(); 
    } 
} 
相關問題