我引用了几个文档,但我需要正确的实现才能正确地完成它。
参考资料
我的问题
Unity使用using (var uc = new UnityContainer()){...},但SimpleInjector有ThreadScopedLifestyle或AsyncScopedLifestyle。我用哪一个?static Main类、static readonly Container和static contructor。我是否为员工角色定义了static Container?那么用于依赖项注册的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();
}
}注意:我不知道上面的代码是否有效。
发布于 2017-06-08 20:59:27
引用-1,联合使用使用(var uc =新的UnityContainer()){.},但是SimpleInjector有ThreadScopedLifestyle或AsyncScopedLifestyle。我用哪一个?
如果我没有弄错的话,Azure工作者角色是一个短暂的应用程序,它会被启动来做一件简单的事情,而不是很快就死掉,就像控制台应用程序一样。
考虑到DI,这使得工作角色的开发与控制台应用程序的开发非常相似。这意味着:
这意味着,由于应用程序是单线程和短暂的,所以不需要使用作用域的生活方式(如ThreadScopedLifestyle或AsyncScopedLifestyle)。相反,您可以轻松地将所有依赖项注册为单例,解析根,调用其方法,并释放容器。
但是,如果您的应用程序存在很长时间,并且在一个没完没了的循环中继续,您通常希望模拟一个‘请求’的概念。这通常意味着每个循环都是一个请求,在此请求期间,您可以从容器解析。请注意,您只需要一个范围的生活方式,如果你真的有范围注册。如果没有,则不必将请求包装在作用域中。如果您已经注册了作用域,则必须将每个请求包装在一个作用域中,就像在您的示例中所做的那样。
Reference-2有静态主类、静态只读容器和静态结构体.是否为员工角色定义静态容器?依赖项注册的静态构造函数呢?
虽然静态构造函数免费提供线程安全和单例行为,但是在抛出异常时,它们会使调试复杂化,因为真正的错误被包装在TypeInitializationException中。但是,您的cctor确实可以轻松地初始化静态Container字段。在静态字段中使用Container是很好的。
但是,由于这些类型的应用程序非常小,只有一小部分依赖项,所以完全不使用DI容器。相反,请使用纯DI。这听起来可能是来自开发和维护DI容器的人的一个奇怪的建议,但我发现将Pure用于小型应用程序更实用,尤其是当您的寄存器都是单例时。其优点是:
https://stackoverflow.com/questions/44441419
复制相似问题