Я сослался на несколько документов, но мне нужна правильная реализация, чтобы сделать это правильно.
Ссылки
Unity to Worker Role: https://alexandrebrisebois.wordpress.com/2013/04/14/building-windows-azure-services-without-compromising-testability/
Приложение SimpleInjector для консоли: http://simpleinjector.readthedocs.io/en/latest/consoleintegration.html
Мои вопросы
Ссылка-1,
Unity
используетusing (var uc = new UnityContainer()){...}
, но SimpleInjector имеетThreadScopedLifestyle
илиAsyncScopedLifestyle
. Какой из них я использую?Ссылка-2 имеет класс
static Main
,static readonly Container
иstatic contructor
. Нужно ли определятьstatic Container
для роли Worker? как насчетstatic constructor
для регистрации зависимостей?Я реализовал, как показано ниже в разделе Моя реализация. Правильно ли реализован этот код?
Справочный код
ссылка 1;
static class Program
{
static readonly Container container;
static Program()
{
container = new Container();
container.Register<IUserRepository, SqlUserRepository>();
container.Register<MyRootType>();
container.Verify();
}
static void Main()
{
var service = container.GetInstance<MyRootType>();
service.DoSomething();
}
}
ссылка 2;
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("Worker entry point called", "Information");
using (var uc = new UnityContainer())
{
uc.RegisterType<ILogger, TableStorageLogger>();
uc.RegisterType<IEnumerable<IMessageHandler>, IMessageHandler[]>();
var processor = uc.Resolve<MessageProcessor>();
while (true)
{
processor.Process();
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
}
Моя реализация
Я подумал, что (1) Container
может быть достаточно, чтобы быть static
, (2) OnStart
— хорошее место для регистрации служб, и (3) я предполагал, что экземпляры служб создаются и удаляются для каждого цикла.
public class WorkerRole : RoleEntryPoint
{
static readonly Container container = new Container();
public override void Run()
{
while (true)
{
using (ThreadScopedLifestyle.BeginScope(container))
{
var service = container.GetInstance<SomeService>();
service.DoSomething();
}
}
}
public override bool OnStart(){
// define.
container.Register<SomeService>();
container.Register<ProcessRecorderSetting>();
container.Verify();
}
}
Примечание. Я не знаю, работает ли приведенный выше код.