0

Hallo sind auf Konsolenanwendung arbeiten, die Dependency Injection-Muster verwendet, ich habe die Schnittstelle wieUnity Config Fehler in Konsolenanwendung

erstellt
public interface IRecurringTransactionPlanDataService : IService<RecurringTransactionPlan> 
    { 
    IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData(); 
    } 

und die Klasse implementiert als

public class RecurringTransactionPlanDataService : Service<RecurringTransactionPlan>, IRecurringTransactionPlanDataService 
{ 
    private readonly IRepositoryAsync<RecurringTransactionPlan> _repository; 

    public RecurringTransactionPlanDataService(IRepositoryAsync<RecurringTransactionPlan> repository) 
     : base(repository) 
    { 
     _repository = repository; 
    } 

    public IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData() 
    { 
     return _repository.RecurringTransactionPlanData(); 
    } 
} 

Das Repository:

der obige Code alle in separaten Projekten, ich benutze dies in MVC und auch in Konsole-Anwendung, während in MVC gibt es keine Fehlerdaten von db von UnityConfig.cs, aber in Konsolenanwendung holen müssen wir manuell registrieren und die Schnittstellen zu beheben, ich dies versucht haben,

Meine Konsole-Anwendung:

public class RecurringTransaction 
{ 
    public readonly IRecurringTransactionPlanDataService _recurringTransactionPlanDataService; 

    public RecurringTransaction() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
     _recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 

     FeePaymentTracker.UnityConfig.RegisterComponents(); 

     RecurringTransaction rt = new RecurringTransaction(); 
     var restult = rt.GetRecurringTransactionRecords(); 
    } 
} 

enter image description here

sind den obigen Fehler. Erwarten Sie Ihre Ideen, um den Fehler zu beheben.

+2

Sie verwenden das Service Locator-Muster, nicht die Abhängigkeitsinjektion. Sie müssen zeigen, wie Sie Ihre Typen bei Unity registrieren. Ich sehe nirgendwo in Ihrem Beispiel einen 'RecurringTransactionPlanDataService'-Typ. – Crowcoder

+0

Bitte beachten Sie die bearbeitete – Ranjith

Antwort

1

In Ihrem RecurringTransaction -Methode Sie einen neuen Container erstellen und dann RecurringTransactionPlanDataService in diesem neuen Container registrieren. Aber Sie registrieren nicht die Abhängigkeiten, die die Implementierung RecurringTransactionPlanDataService hat. Dieser Container hat nur eine Registrierung.

var container = new UnityContainer(); 
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

Da RecurringTransactionPlanDataService hat eine Abhängigkeit zu IRepositoryAsync<RecurringTransactionPlan> Sie müssen das auch registrieren.

Ihren Code ändern:

var container = new UnityContainer(); 
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
container.RegisterType<IRepositoryAsync<RecurringTransactionPlan>, YourRepositoryImplementation>(); 
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

Als Nebenbemerkung Sie den gleichen Behälter wiederverwenden möchten. In Konsolen-Anwendungen löse ich normalerweise einen "ProgramStarter" auf, der dann die richtigen Injektionen bekommt. Auf diese Weise müssen Sie nur das Service-Locator-Anti-Pattern im Root-Verzeichnis verwenden. Aber kann den richtigen DI in den Rest der Anwendung verwenden.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<ProgramStarter, ProgramStarter>(); 

     // Pass the same container to the config. 
     FeePaymentTracker.UnityConfig.RegisterComponents(container); 
     var program = container.Resolve<ProgramStarter>(); 
     program.Run(); 
    } 
} 

public class ProgramStarter 
{ 
    IRecurringTransactionPlanDataService _dataService; 
    public ProgramStarter(IRecurringTransactionPlanDataService dataService) 
    { 
     _dataService = dataService; 
    } 

    public void Run() 
    { 
     // Do stuff. 
    } 
} 
1

In dem Code, den Sie gepostet haben, haben Sie eine Schnittstelle namens IPaymentService und seine Implementierung. Es scheint in Ordnung zu sein. Aber dann versuchen Sie im Screenshot eine Abhängigkeit namens RecurringTransactionPlanDataService aufzulösen. Machen Sie Ihre, dass Sie diese Abhängigkeit registriert haben. Können Sie Informationen darüber hinzufügen, wie Sie die Abhängigkeiten im Container registrieren?

Das Problem in Ihrem Code ist, dass Sie versuchen, die Implementierung anstelle der Schnittstelle zu lösen.

_recurringTransactionPlanDataService = container.Resolve<RecurringTransactionPlanDataService>(); 

mit, dass: Sie sollten die folgende Zeile ändern

_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

Cheers,

+0

Ich habe den Interface-Namen für das einfache Verständnis geändert, bitte beachten Sie den Fehler im Screenshot selbst, die ist ** ResolutionFailedException **, – Ranjith

+0

Können Sie zeigen, das Stück Code, wo Sie Komponenten im Container registrieren ? Können Sie weitere Informationen zur Ausnahme hinzufügen? –

+0

Ich habe meine Konsole App auch hinzugefügt – Ranjith