2016-08-04 2 views
1

В основном у меня есть модуль, который имеет класс, который имеет метод, в котором я буду получать различные типы элементов контента в качестве параметра, а также строку, представляющую тип события . В зависимости от того, какой тип элемента контента передан, я хочу обработать этот элемент определенным способом, вызвав его метод пользовательского обработчика, для которого он всегда имеет тип события.Есть ли способ добавить пользовательские обработчики событий к части в Orchard?

Я стараюсь избегать связи любой ценой, поэтому этот модуль не должен знать об этих элементах контента или методах обработки событий.

  1. Мне нужно возвращать список всех зарегистрированных обработчиков или методов обработчиков для любого элемента контента Я проходящие в.
  2. Основываясь на какие события это, я тогда нужен назвать (зарегистрировано?) обработчик событий для этого элемента контента.

Есть ли способ сделать это в саду ???

+1

Не совсем понятно, что вы пытаетесь сделать: это поможет, если вы сможете объяснить сценарий. Очень вероятно, что уже существует стандартный способ достижения того, что вы пытаетесь, и что он может расходиться с вашей идеей о том, как он должен работать. Например, Orchard имеет стандартную шину событий. Вы знаете об этом и имеете причины не использовать это? –

+0

Я только что наткнулся на это сообщение в stackoverflow, которое именно то, что я пытаюсь сделать, и, возможно, он объясняет это лучше: http://stackoverflow.com/questions/25848958/communication-between-custom-modules-in-orchard- КМВ. Таким образом, похоже, что использование шины событий и реализация Ieventhandler - это способ достичь того, что я пытаюсь сделать, чтобы не ссылаться на другие модули. Но, к сожалению, этот URL: http://www.ideliverable.com/blog/ieventhandler, кажется, единственный учебник, который я могу найти по этому вопросу, и я не могу обернуть голову вокруг концепции ... –

ответ

2

Коммуникация по модулю не так уж трудна, как только вы ее повесите. Есть также несколько способов добиться этого. Этот ответ основан на вашем последнем комментарии, так как Бертран указал вам в правильном направлении.

Использование простых 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" } 
       } 
      ) 
     } 
    } 
} 

Я надеюсь, что эти примеры помогут вам немного. Я написал все с головы, так что, возможно, что-то забыл.

Если у вас есть дополнительные вопросы, дайте мне знать в комментариях, и я обновлю свой ответ или просто перейду на канал для садоводства.

+0

Ничего себе! Это такие люди, как ты, которые заставляют меня гордиться тем, что я являюсь частью сообщества Орчард! Я использую orchard сейчас в течение 2 месяцев, и это в основном первое, что я слышу о действиях. Я буду стараться изо всех сил, чтобы реализовать его, но теперь все кажется намного более понятным. Я дам вам знать, есть ли у меня какие-либо последующие вопросы. Еще раз спасибо! –

+0

Отличный ответ @Xceno, очень ясный и хорошо объясненный, мне это нравится – mdameer

 Смежные вопросы

  • Нет связанных вопросов^_^