代码之家  ›  专栏  ›  技术社区  ›  wal

autofac与简单IoC实现的比较

  •  1
  • wal  · 技术社区  · 13 年前

    我目前正在使用/试验autofac作为我的IoC控制器。

    public static TService Resolve<TService>()  
    public static void Register<IType, ImpType>()
    

    现在转到autofac。注册时,您可以执行以下操作

    builder.RegisterType<ProductRepository>().As<IProductRepository>(); 
    

    但是,如果ProductRepository不是IProductRepository,则不会出现编译错误? 如果需要的话,有什么方法可以更安全地把东西连接起来吗?

    public static class IoCContainer
    {
        public static IContainer BaseContainer { get; private set; }
    
        public static void Build(ContainerBuilder builder)
        {
            BaseContainer = builder.Build();            
        }
    }
    

    在我调用了IoCContainer.Build(..)之后,我就不能再在BaseContainer中注册任何东西了。与简单模型相比,您可以在任何地方注册任何内容。也许这是故意的?

    1 回复  |  直到 13 年前
        1
  •  1
  •   Wim Coenen    13 年前

    我认为 .RegisterType<Foo>.As<IFoo> 模式不是类型安全的,因为C#编译器(或CLR类型系统)不处理此类类型约束。例如,下面的假设声明 As

    interface IRegistration<TImplementation>
    {
       void As<TContract>() where TImplementation : TContract;
    }
    

    编译器错误是“SomeNamespace.IRegistration.As()”未定义类型参数“TImplementation”。

    下面的方法似乎有效(尽管 best practices 关于Autofac wiki的部分)。它将给出编译器错误,除非 Foo IFoo :

         var builder = new ContainerBuilder();
         builder.Register<IFoo>(c => new Foo()).SingleInstance();
    
         var container = builder.Build();
         var foo = container.Resolve<IFoo>();
    

    c IComponentContext . 如果 c => new Foo(c.Resolve<IBar>()) .

    在我调用了IoCContainer.Build(..)之后,我就不能再在BaseContainer中注册任何东西了

    update the container 在Autofac 2.2中。