ServiceStack.Funq.Quartz не может создать экземпляр типа?
Пример кода ServiceStack.Funq.Quartz
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();
}
}
Выше работает отлично. Если я в классе MyServices, удалил функцию Any и прокомментировал внутренний код Execute.
public class MyServices : Service
{
}
quartz.net получит ошибку:
[Quartz.Core.ErrorLogger】 An error occurred instantiating job to be executed. job= 'JobGroup1.GetUserJob111' Problem instantiating type 'ServiceStackWithQuartz.HelloJob'
почему класс должен иметь публичный объект Any(Hello request)
функция?
1 ответ
Спасибо за использование пакета - я понятия не имел, что другие люди сочтут это полезным.
Так что, если я правильно понимаю, в вашей ситуации у вас есть:
public class MyServices : Service
{
}
И вы пытаетесь разрешить этот Сервис с помощью инжектора конструктора, который эффективно выполняет:
container.Resolve<MyServices>();
Это не удастся из-за способа работы IoC ServiceStack Funq. Вы не можете разрешить Сервис ServiceStack, в котором ничего нет (вы, вероятно, никогда бы этого не захотели) - у него должна быть хотя бы одна реализация сервиса, не имеет значения, что это за реализация.
Кроме того, если вы хотите улучшить ServiceStack.Funq.Quartz, не стесняйтесь вносить свой вклад в базу кода.
Изменить: Вероятно, стоит упомянуть, что вы можете добавить класс "Необслуживания" с вашей логикой, если хотите. Вы можете разрешить другие классы, которые не основаны на ServiceStack.Service, даже если в них ничего нет.
Изменить 2: Отвечая на вашу проблему "Служба не утилизировать". Это то же самое для ServiceStack и не имеет ничего общего с вашей работой Quartz. Если вы позвоните:
container.Resolve<MyServices>().Any(new new ServiceModel.Hello { });
Например, из AppHost ваш сервис не будет удален сам по себе. Если вы хотите, чтобы он утилизировался, вы можете заключить его в оператор использования. например
using (var service = MyServices)
{
var response = MyServices.Any(new ServiceModel.Hello { });
}
Использование гарантирует, что ваш сервис будет утилизирован впоследствии.
В качестве альтернативы вы можете добавить интерфейс "IDispose" к вашему Quartz Job и реализовать метод Dispose(), который будет выполнять:
MyServices.Dispose();
Это будет вызвано после выполнения задания.