В данной лекции рассмотрена минимальная реализация акторной модели, включающая
- отправку сообщений,
- создание новых акторов и смену поведения для приема следующего сообщения.
Исходный код реализации выложен на https://github.com/hwdtech/HWdTech.DS. Код на C#.
При разработке использовались библиотеки: Autofac, NuUnit, Moq
4. MessageBus 121
public class MessageBus
{
public static void Send(IMessage message)
{…}
public static void Join(
string address,
Actor actor
)
{ … }
}
5. Actor 122
public abstract class Actor
{
public Actor(string address) { … }
public Actor() { … }
public void Become(Action<IMessage> handler)
{ … }
public void Receive(IMessage message) { … }
public abstract void Handle(IMessage message);
}
6. Фасад для IoC 123
public class DIContainer
{
IContainer container;
public T Resolve<T>()
{
return container.Resolve<T>();
}
}
7. Фасад для IoC 124
Файл: RouterImpl/IoCRegistration.cs
using Autofac;
namespace HWdTech.DS.Internals.Implementation
{
class RouterRegistrationModule : Module
{
protected override void Load(ContainerBuilder builder)
{
IRouter router = new RouterImpl();
builder.RegisterInstance(router).As<IRouter>();
}
}
}
8. Фасад для IoC 125
public class DIContainer
{
public DIContainer()
{
ContainerBuilder builder = new ContainerBuilder();
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
builder.RegisterAssemblyModules(assemblies);
this.container = builder.Build();
AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoadEventHandler;
}
void AssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args)
{
LoadAssembly(args.LoadedAssembly);
}
LoadAssembly(Assembly assembly)
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterAssemblyModules(assembly);
builder.Update(container);
}
}
9. Реализация MessageBus.Join 126
static IRouter router;
public static void Join(string address, Actor actor)
{
if (null == router)
{
router = Singleton<DIContainer>.Instance.Resolve<IRouter>();
}
router.RegisterOrReplace(address, actor.Receive);
}