2017-09-06 2 views
0

Ich habe eine Konsolenanwendung, mit der Autofac DI zum Einfügen von Daten und Service-Layer aus einem Webanwendungsprojekt verwendet wird.Autofac DI funktioniert nicht wie erwartet in der Konsolenanwendung

hier ist die Einrichtung auf Konsolenanwendung:

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

Hauptprogrammklasse:

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

Wenn die Anwendung funktioniert die Daten laufen wird geladen. Das Speichern eines neuen Eintrags scheint die Arbeit jedoch nicht zu erledigen.

Allerdings, wenn ich DI entfernen und einfache Klasse Initialisierung in der Run-Methode verwenden, wie unter dem Speichern funktioniert:

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

Bin ich etwas, während ich ein Setup fehlt die Autofac? Es scheint auf die Daten zuzugreifen, aber wenn es zum Speichern kommt, werden die Daten nicht gespeichert. Ich debuggte, um irgendein Problem zu sehen, aber das Programm läuft gut ohne Fehler. Wie kann ich diese Art von Problemen debuggen, um weitere Details zu finden?

Aktualisiert
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

Hier gibt es nicht genügend Informationen ist Ihre Frage zu beantworten. Wir wissen nicht, was deine Klassen tun. – DavidG

+0

Wo ist der "Speichern" -Code im DI-Beispiel? –

+0

Das Problem scheint in "DataService" und nicht in "AutoFac" – Dinny

Antwort

2

Nach der Lektüre Autofac Tive here

Ich fand heraus, dass Standardbereich Instanz pro Abhängigkeit ist. Dies bedeutet, dass eine eindeutige Instanz von jeder Anfrage für einen Service zurückgegeben wird. DbFactory sollte für InstancePerLifetimeScope sein.

So ändert Konfiguration unten behebt das Problem:

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