Jun*_*ior 6 c# asp.net unity-container event-listener asp.net-mvc-5
我有一个用c#ASP.NET MVC 5框架编写的项目.我设置了一个IoC使用Unity容器来处理依赖注入.
我需要建立某种通信功能,我的应用程序的任何部分都可以监听事件然后执行特定的逻辑.
以下是我第一次尝试构建事件/监听器,但想知道这是否是一个好方法,以及是否有更好的方法来创建事件/监听器.
// First we define a base class for the Events
// This allows me tho identify Events. Perhaps this could be changed to interface instead of a base class
public abstract class Event
{
}
// Second we define a base class for our listener
// each listener must provide a an event that it wish to listen to
public abstract class Listener<T> where T : Event
{
// each listener will add to do logic inside the Handle() method
public abstract void Handle(T _event);
}
// Here is my announcing service or event dispatcher
// This class announces that an event took place for anyone that cares
public class Announcer : IAnnouncer
{
private IUnityContainer Container;
public Announcer(IUnityContainer container)
{
Container = container;
}
public void Announce<T>(T _event) where T : Event
{
// Get all listeners
var listeners = Container.ResolveAll<Listener<T>>();
foreach(var listener in listeners)
{
// here I may need to add a support to queue up the events or delay dispatching if needed
try
{
listener.Handle(_event);
if(listener is IHandleSuccess _listener)
{
_listener.Finished(_event, listener);
}
}
catch (Exception e)
{
if (listener is IHandleFailed _listener)
{
_listener.Failed(_event, e);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我将如何使用上述代码的示例.假设我想发送一封欢迎电子邮件,并在创建用户后为用户安排一个方向.
// First, define a simple event called UserWasCreated
public class UserWasCreated : Event
{
public User User { get; private set; }
public UserWasCreated(User user)
{
User = user;
}
}
// Listener Example 1, Now we have a listener that would listen for when a user is added
// This listener would simply send a welcome email to the new user
public class SendWelcomeEmail : Listener<UserWasCreated>
{
public void Handle(UserWasCreated _event)
{
// here we can send an to the event.User....
}
}
// Listener Example 2, Now we have a listener that would listen for when a user is added
// This listener would simply sign up the user for an orientation
public class ScheduleOrientation : Listener<UserWasCreated>
{
public void Handle(UserWasCreated _event)
{
// here we can schedule the orientation
}
}
// In the controller we make announcement that the event took place
public UsersController : Controller
{
private IUserMapper UserMapper;
private IAnnouncer Announcer;
private IUserService UserService;
public UsersController(IUserMapper userMapper, IAnnouncer announcer, IUserService userService)
{
UserMapper = userMapper;
Announcer = announcer;
UserService = userService;
}
...
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Create(CreateUserViewModel viewModel)
{
if (ModelState.IsValid)
{
User user = UserMapper.Map(viewModel);
UserService.Create(user);
// Here we announce the the event UserWasCreated took place.
Announcer.Announce(new UserWasCreated(user));
}
return View(viewModel);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:在ASP.NET MVC 5项目中是否有更好的方法来创建事件/侦听器?上述设置有什么问题?