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

Это будет вызвано после выполнения задания.

Другие вопросы по тегам