@ Алекс Сейчас я получаю счет операций как 0, и из-за этого я получаю исключение: тип не зарегистрирован
я есть следующее заявление:
1)Приложение Mvc : Клиент Hangfire, откуда я буду ставить задания и размещать панель управления. Это приложение будет содержать ссылку на мою библиотеку классов.
2)Консольное приложение : Сервер Hangfire будет жить в этом консольном приложении.
3)Библиотека классов : Общая библиотека между сервером Hangfire (консольное приложение) и клиентом Hangfire (asp.net mvc), в котором будет находиться мой долгосрочный код. Сервер Hangfire выполнит код этой библиотеки.
У меня есть структура, как показано ниже в библиотеке классовшаблон дизайна стратегии.
Код взят из следующего:Ссылка:
Интерфейсы:
public interface IOperation
{
Output Process(Input input);
bool AppliesTo(Type type);
}
public interface IOperationStrategy
{
Output Process(Type type,Input input);
}
Операции:
public class Add : IOperation
{
public bool AppliesTo(Type type)
{
return typeof(Add).Equals(type);
}
public Output Process(Input input)
{
// Implementation
return new Output();
}
}
public class Multiply : IOperation
{
public bool AppliesTo(Type type)
{
return typeof(Multiply).Equals(type);
}
public Output Process(Input input)
{
// Implementation
return new Output();
}
}
стратегия:
public class OperationStrategy : IOperationStrategy
{
private readonly IOperation[] operations;
public OperationStrategy(params IOperation[] operations)
{
if (operations == null)
throw new ArgumentNullException(nameof(operations));
this.operations = operations;
}
public Output Process(Type type, Input input)
{
var op = operations.FirstOrDefault(o => o.AppliesTo(type));
if (op == null)
throw new InvalidOperationException($"{operation} not registered.");
return op.Process(input);
}
}
использование:
// Do this with your DI container in your composition
// root, and the instance would be created by injecting
// it somewhere.
var strategy = new OperationStrategy(
new Add(), // Inject any dependencies for operation here
new Multiply()); // Inject any dependencies for operation here
// And then once it is injected, you would simply do this.
var input = new Input { Value1 = 2, Value2 = 3 };
BackgroundJob.Enqueue(() => strategy.Process(typeof(Add), input));
Но сервер Hangfire не может выбрать работу, и когда я проверяюstate table
я вижу ошибку, как показано ниже:
"FailedAt": "2018-03-21T13: 14: 46.0172303Z", "ExceptionType": "System.MissingMethodException", "ExceptionMessage": "Для этого объекта не определен конструктор без параметров.", "ExceptionDetails": "System.MissingMethodException : Для этого объекта не определен конструктор без параметров. \ R \ n в System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, логическое значение publicOnly, логическое значение noCheck, логическое значение & canBeCached, RuntimeMethodHandleInternal & ctor, логическое значение & bNeedSlowEnt_ReignSecurity.NecurityCheck) publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMark & stackMark) \ r \ n в System.Activator.CreateInstance (тип Type, логический непубличный) \ r \ n в System.Activator.CreateInstance (тип тип) \ r \ n в HangfireJ. .SimpleJobActivatorScope.Resolve (Type type) \ r \ n в Hangfire.Server.CoreBackgroundJobPerformer.Perform (контекст PerformContext) \ r \ n в Hangfire.Server.BackgroundJobPerformer. <> C__DisplayClass8_0.b__er at (n) () .BackgroundJobPerformer.InvokePe rformFilter (фильтр IServerFilter, preContext PerformingContext, продолжение Func 1) \ r \ n в Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters (контекст PerformContext, фильтры IEnumerable`1) \ r \ n в контексте Hangfire.Server.BackformConform () r \ n at Hangfire.Server.Worker.PerformJob (Контекст BackgroundProcessContext, соединение IStorageConnection, String jobId) "
Я не получаю то, что должно быть настроено для этой структуры, так как у меня здесь нет контейнера IOC.
Кто-нибудь может помочь мне с этим?
Демо-проект:https://www.dropbox.com/s/bfjr58y6azgmm3w/HFDemo.zip?dl=0