8

我正在尝试注册一个名为“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 中注册所有组件吗?有没有办法做到这一点?因为业务中的对象和服务会随时间变化。

谢谢

4

1 回答 1

9

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

 builder.RegisterAssemblyTypes(services);

在没有任何附加参数的情况下,您实际上是在由 class 键入的该程序集中注册所有类型。您可能会看到此解析有效:

GetInstance<SomeSpecificUserImplementation>();

为了通过 interface为您的服务设置密钥,只需执行以下操作:

  builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();

现在您的所有服务都将由它们实现的接口而不是特定类作为键,因此以下将起作用:

GetInstance<IUser>();
于 2012-05-10T09:26:57.440 回答