代码之家  ›  专栏  ›  技术社区  ›  Mihai Lazar

自动空调的优点和缺点是什么

  •  4
  • Mihai Lazar  · 技术社区  · 17 年前

    我听说自动空调很快。我已经看到了相关的编码,而且非常整洁。但我不太清楚怎么用。我使用了structuremap,它有一个静态的objectfactory。Ninject有内核,但在Autopac的谷歌页面中,他们建议这样做:

    using( var resolver = builder.Build() ){
       var whatINeed = resolver.Resolve<INeedThisService>();
    }
    

    这是一个WinForms应用程序,所以我从上面得到了一个无效的对象状态,所以我切换到拥有一个全局IContainer,然后这样做了。

     using( var resolver = Program.Container.CreateInnerContainer() )
     {
         var whatINeed = resolver.Resolve<INeedThisService>();
     }
    

    我用了三五次。但这有效率吗?或者我应该做点什么

     var whatINeed = Program.Resolve<INeedThisService>()
    

    在被子下面

     internal static TServervice Resolver<TService>(){
           if(_container == null ) _container = builder.Build();
           return _container.Resolve<TService>();
     }
    

    你会用哪一个,为什么?使用createInnerContainer()也会受到惩罚吗?

    3 回复  |  直到 8 年前
        1
  •  8
  •   Mark Lindell    17 年前

    我不是自动空调专家,但有其他国际奥委会集装箱的经验。我想这个问题会给我一个尝试自动空调的理由。

    基于IOC容器的设计应努力将所有代码与访问容器隔离开来,入口点或主机级别除外。我使用autopac和winforms创建了下面的示例,以演示窗体如何通过其构造函数访问服务。

    我不太清楚为什么你认为你需要内部容器。也许你可以发表评论,我可以提供更详细的回复。

    static class Program
    {
        [STAThread]
        static void Main()
        {
            var builder = new ContainerBuilder();
            builder.Register<TheService>().As<INeedThisService>();
            builder.Register(f => new Form1(f.Resolve<INeedThisService>())).As<Form1>();
    
            using (var container = builder.Build())
            {
                Application.Run(container.Resolve<Form1>());
            }
    
        }
    }
    
    public interface INeedThisService { }
    
    public class TheService : INeedThisService
    {
        public TheService() { Console.WriteLine("ctor ThisService"); }
    }
    
    public partial class Form1 : Form
    {
        public Form1(INeedThisService service)
        {
            Console.WriteLine("ctor Form1");
            InitializeComponent();
        }
    }
    
        2
  •  5
  •   andrey.tsykunov    16 年前

    1)从您给出的示例中,我可以假设您主要使用IOC容器作为服务定位器。尽管几乎所有容器都支持它,但主要用途是 依赖注入 .这意味着您应该完全避免调用resolve方法,并让容器为您注入所有依赖项。它们之间的区别(服务定位器和依赖注入)超出了这个主题。

    2)如果您仍然想使用它作为服务定位器,您可以只使用根容器。( 程序容器 在您的情况下)而不创建内部容器。顺序如下:

    • 创建ContainerBuilder
    • 在生成器中注册组件
    • 创建根容器:builder.build()。
    • 访问根容器以解析组件实例

    3)容器层次结构在需要不同范围内的单例行为的情况下非常有用:

    • 全局\会话\请求(Web应用程序)
    • 应用程序\插件(基于桌面插件的应用程序)

    btw autopac鼓励人们使用 tagged contexts 要解决这些问题:

        3
  •  3
  •   Nicholas Blumhardt    17 年前

    正如MarkLindell指出的那样,在autopac应用程序中通常不需要直接访问容器。

    推荐的方法是在应用程序启动时访问一次,正如Mark所做的那样。

    随后需要创建对象的其他组件可以声明IContext类型的构造函数参数,AutoFac将自动注入该参数。

    另一种不需要依赖autopac组件的方法是使用生成的工厂,如下所述: http://code.google.com/p/autofac/wiki/DelegateFactories

    希望这有帮助!

    推荐文章