2017-09-06 3 views
0

J'ai une application de console qu'autofac DI est utilisée pour injecter des données et une couche de service à partir d'un projet d'application Web.Autofac DI ne fonctionne pas comme prévu dans la console Application

ici est la configuration de l'application de la console:

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

classe principale du programme:

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

Lorsque l'application est exécutée chargement des données fonctionne très bien. Cependant, enregistrer une nouvelle entrée ne semble pas faire le travail.

Cependant, lorsque je retire DI et une utilisation simple de classe dans Initializing la méthode Run comme ci-dessous la sauvegarde fonctionne très bien:

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

Est-ce que je manque quelque chose pendant que je la configuration autofac? Il semble bien accéder aux données, mais quand il s'agit de sauvegarder, il ne sauvegarde pas les données. J'ai débogué pour voir n'importe quel problème mais le programme tourne bien sans erreur. Comment puis-je déboguer ce genre de problèmes pour trouver plus de détails?

Mise à jour

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

Il n'y a pas assez d'informations ici pour répondre à votre question. Nous ne savons pas ce que font vos classes. – DavidG

+0

Où est le code "sauvegarde" dans l'exemple DI? –

+0

Le problème semble être dans 'DataService' et non dans 'AutoFac' – Dinny

Répondre

2

Après avoir lu les étendues de autofac here

je trouve que la portée par défaut est l'instance par la dépendance. Ce qui signifie qu'une instance unique sera renvoyée à partir de chaque demande de service. DbFactory devrait être pour InstancePerLifetimeScope.

fixe changer la configuration ci-dessous donc la question:

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