Autofac使用Assembly.Load注册dll

时间:2012-05-10 08:40:16

标签: c# asp.net-mvc-3 model-view-controller autofac

我正在尝试注册一个名为“BigEye.Business”的dll,并将该文件引用到mvc 3项目中。但是当我尝试在该dll中获取对象的实例时,autofac表示它没有注册。以下是我如何注册和解析对象:

private static IContainer SetDIContainer()
        {
            var builder = new ContainerBuilder();
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            builder.RegisterType<UserAuthManager>().As<IUserAuth>().InstancePerHttpRequest();
            builder.RegisterType<SessionManager>().As<ISession>().InstancePerHttpRequest();


            //Here is the code to register that dll
            var services = Assembly.Load("BigEye.Business");
            builder.RegisterAssemblyTypes(services);
            IContainer container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            return container;
        }

        public static T GetInstance<T>()
        {
            IContainer container = SetDIContainer();

            using(var httpRequestScope = container.BeginLifetimeScope("httpRequest"))
            {
                return httpRequestScope.Resolve<T>();
            }

        }

当我调用GetInstance函数时,我得到“所请求的服务'BigEye.Interfaces.Business.IUser'尚未注册”。我应该注册Business dll中的所有组件吗?有办法吗?因为Business中的对象和服务会及时发生变化。

由于

1 个答案:

答案 0 :(得分:8)

我假设您的程序集包含IUser接口的一个或多个实现。现在,当你运行:

 builder.RegisterAssemblyTypes(services);

没有任何其他参数,您实际上正在注册该类按类键入的程序集中的所有类型。你可能会看到这个解决方案有效:

GetInstance<SomeSpecificUserImplementation>();

要通过界面键入您的服务,只需执行以下操作:

  builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();

现在,所有服务都将通过它们实现的接口而非特定类来锁定,因此以下内容将起作用:

GetInstance<IUser>();