Autofac使用Assembly.Load注册dll

meh*_*rif 8 c# model-view-controller autofac asp.net-mvc-3

我正在尝试注册一个名为"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>();
            }

        }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Pet*_*old 8

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

 builder.RegisterAssemblyTypes(services);
Run Code Online (Sandbox Code Playgroud)

没有任何其他参数,您实际上正在注册由类键入的程序集中的所有类型.您可能会看到此解析有效:

GetInstance<SomeSpecificUserImplementation>();
Run Code Online (Sandbox Code Playgroud)

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

  builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)

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

GetInstance<IUser>();
Run Code Online (Sandbox Code Playgroud)