Коммуникация по модулю не так уж трудна, как только вы ее повесите. Есть также несколько способов добиться этого. Этот ответ основан на вашем последнем комментарии, так как Бертран указал вам в правильном направлении.
Использование простых EventHandlers
Для более сложного примера рассмотрим существующую IUserEventHandler в Orchard.Users.
Модуль A
Услуги/IMyCustomEventHandler.cs
namespace My.ModuleA.Services
{
// This is the eventHandler you inject wherever you need it. (e.g. Module B)
public interface IMyCustomEventHandler : IEventHandler
{
// IContent should suit you in this case but you could also pass in
// just the contentItem id, or whatever else you need.
void SomethingHappened(IContent content);
}
}
Модуль B
Контроллеры/FancyController.cs
namespace My.ModuleB.Controllers
{
public class FancyController : Controller
{
private readonly IMyCustomEventHandler handler;
public FancyController(IMyCustomEventHandler handler)
{
this.handler = handler;
}
public ActionResult DoSomething()
{
// ...some computation here
this.handler.SomethingHappened(myContentItem);
}
}
}
Модуль C
Обработчики/BoringCustomEventHandler.cs
namespace My.ModuleC.Handlers
{
// This is the most basic eventhandler to implement
public class BoringCustomEventHandler : IMyCustomEventHandler
{
public void SomethingHappened(IContent content)
{
// Do whatever here.
// As you can see we handle an Event here in Module C
// that was dispatched in Module B
// via a service declared in Module A.
}
}
}
Использование рабочих процессов/Деятельность
Хорошо, теперь это становится интересным. Сочетание Orchard.Workflows, Orchard.Tokens, ваш пользовательский EventHandler и ваше воображение - очень мощный способ обработки всех видов сценариев. Модули даже не должны знать друг друга на этом уровне (здесь очень обобщенное утверждение).
Давайте посмотрим:
модуль A
Сначала мы должны определить активность пользовательских рабочих процессов.
Деятельность/SomethingHappenedActivity.cs
namespace My.ModuleA.Activities
{
public class SomethingHappenedActivity : Event
{
// This is a neat convention for avoiding typos.
public const string EventName = "SomethingHappened";
// As the name says, this Activity will be able to start a workflow when triggered.
// There are a lot of existing Activities, so I encourage you to check them out.
public override bool CanStartWorkflow
{
get { return true; }
}
// ... other stuff here
}
}
С нашей пользовательской активности в месте, мы можем, наконец, сделать какой-то рабочий процесс магии. Возможности здесь почти бесконечны; вы можете запускать другие рабочие процессы, писать электронные письма и т.д.
Хендлеров/WorkflowMyCustomEventHandler.cs
namespace My.ModuleA.Handlers
{
// This implementation of our custom event handler will trigger workflow activities for us.
public class WorkflowMyCustomEventHandler : IMyCustomEventHandler
{
private readonly IWorkflowManager workflowManager;
public WorkflowMyCustomEventHandler(IWorkflowManager workflowManager)
{
this.workflowManager = workflowManager;
}
// Should be self-explanatory.
// When we invoke our IMyCustomEventHandler.SomethingHappened() event,
// this implementation will trigger our custom workflow activity.
// Also don't forget that you can do all kinds of magic with *Orchard.Tokens*!
public void SomethingHappened(IContent content)
{
this.workflowManager.TriggerEvent(
SomethingHappenedActivity.EventName,
content.ContentItem,
() => new Dictionary<string,object>
{
{ "Content", content.ContentItem },
{ "OtherStuff", "whatever else you want to provide here" }
}
)
}
}
}
Я надеюсь, что эти примеры помогут вам немного. Я написал все с головы, так что, возможно, что-то забыл.
Если у вас есть дополнительные вопросы, дайте мне знать в комментариях, и я обновлю свой ответ или просто перейду на канал для садоводства.
Не совсем понятно, что вы пытаетесь сделать: это поможет, если вы сможете объяснить сценарий. Очень вероятно, что уже существует стандартный способ достижения того, что вы пытаетесь, и что он может расходиться с вашей идеей о том, как он должен работать. Например, Orchard имеет стандартную шину событий. Вы знаете об этом и имеете причины не использовать это? –
Я только что наткнулся на это сообщение в stackoverflow, которое именно то, что я пытаюсь сделать, и, возможно, он объясняет это лучше: http://stackoverflow.com/questions/25848958/communication-between-custom-modules-in-orchard- КМВ. Таким образом, похоже, что использование шины событий и реализация Ieventhandler - это способ достичь того, что я пытаюсь сделать, чтобы не ссылаться на другие модули. Но, к сожалению, этот URL: http://www.ideliverable.com/blog/ieventhandler, кажется, единственный учебник, который я могу найти по этому вопросу, и я не могу обернуть голову вокруг концепции ... –