2016-04-21 11 views
1

ServiceStack.Funq.Quartz Beispielcode istServiceStack.Funq.Quartz kann Typ nicht instanziieren?

public class MyServices : Service 
{ 
    public object Any(Hello request) 
    { 
     return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) }; 
    } 
} 

public class HelloJob : IJob 
{ 
    private MyServices MyServices { get; set; } 
    public HelloJob(MyServices myServices) 
    { 
     MyServices = myServices; 
    } 
    public void Execute(IJobExecutionContext context) 
    { 
     var response = MyServices.Any(new ServiceModel.Hello 
     { 
      Name = "CodeRevver" 
     }); 
     response.PrintDump(); 
    } 
} 

Die oben funktioniert gut ist. Wenn ich in der MyServices-Klasse die Any-Funktion entferne und den inneren Code kommentieren.

public class MyServices : Service 
{ 

} 

wird die quartz.net die Fehler:

[Quartz.Core.ErrorLogger】 An error occurred instantiating job to be executed. job= 'JobGroup1.GetUserJob111' Problem instantiating type 'ServiceStackWithQuartz.HelloJob' 

, warum die Klasse öffentliches Objekt Any(Hello request) Funktion haben muss?

Antwort

2

Danke für die Verwendung des Pakets - ich hatte keine Ahnung, dass andere Leute es nützlich finden würden.

Also, wenn ich das richtig, in Ihrer Situation verstehen Sie haben:

public class MyServices : Service 
{ 
} 

Und Sie versuchen, diesen Service über Konstruktor Injektion zu lösen, die effektiv ein tun ist:

container.Resolve<MyServices>(); 

Diese wird aufgrund der Funktionsweise des ServiceStack Funq IoC fehlschlagen. Sie können keinen ServiceStack-Service auflösen, der nichts enthält (wahrscheinlich auch nicht). Er muss mindestens eine Service-Implementierung haben. Es spielt keine Rolle, was die Implementierung ist.

Auch, wenn Sie ServiceStack.Funq.Quartz verbessern möchten, fühlen Sie sich frei, zur Codebasis beizutragen.

Bearbeiten: Es ist wahrscheinlich erwähnenswert, dass Sie eine "Non-Service" -Klasse mit Ihrer Logik injizieren können, wenn Sie möchten. Sie können auch andere Klassen auflösen, die nicht auf ServiceStack.Service basieren, auch wenn nichts darin enthalten ist.

Bearbeiten 2: Reagieren auf Ihr Problem "Service wird nicht entsorgen". Dies ist in ServiceStack gleich und hat nichts mit Ihrem Quartz Job zu tun. Wenn Sie einen Anruf:

container.Resolve<MyServices>().Any(new new ServiceModel.Hello { }); 

von AppHost zum Beispiel Ihren Dienst gewohnt selbst entsorgen. Wenn Sie möchten, dass es entsorgt wird, können Sie es in eine using-Anweisung einfügen. z.B.

using (var service = MyServices) 
{ 
    var response = MyServices.Any(new ServiceModel.Hello { }); 
} 

Die wird gewährleistet, dass Ihr Dienst anschließend entsorgt werden.

Alternativ können Sie die Schnittstelle „IDispose“ auf Ihrem Quartz Job hinzufügen und eine Methode Dispose() implementieren, das eine tun:

MyServices.Dispose(); 

Dies aufgerufen wird, nachdem ein Auftrag ausgeführt hat.

+0

Danke für die Antwort. Ja, du hast recht. wegen der Art und Weise der ServiceStack Funq IoC, Es muss mindestens eine Service-Implementierung, die ein Service, wenn enthält (Any, Put, Get, Post ..), funktioniert gut, aber ich brauche nur einige Datenbank-Operationen, @mythz hat irgendeinen Ratschlag? – ali

+0

Funq verwendet 'container.Resolve 'für Konstruktorinjektion, die eine obligatorische Abhängigkeit darstellt, aber wenn Sie ** öffentliche Eigenschaften ** verwenden, löst Funq stattdessen Abhängigkeiten mit' container.TryResolve ', die optional sein können. – mythz

+0

Endlich muss ich in der Initialisierungsklasse 'container.RegisterAutoWiredType (typeof (MyServices));' hinzufügen. aber ich fand den Quartz.net-Job ausgeführt, wird es nicht aufrufen, die 'Service.Dispose()', dann, wenn in MyService ich Db-Vorgang aufrufen, wird es die Verbindung nicht schließen und dispose(). @ Michael Clark – ali

Verwandte Themen