使用Assembly.Load注册dll的Autofac

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中注册所有组件吗?是否有一种方法可以做到这一点?因为Business中的对象和服务将随着时间的推移而变化。
谢谢。

你能否在项目中添加对你的dll的引用? - Ctrl_Alt_Defeat
1
好的,我可以做到,但我想要注入它... - mehmetserif
“builder.RegisterAssemblyTypes(services);” 这行代码的作用就是这个意思,对吧?如果可以的话,我建议你尝试进入这个代码块,弄清楚它实际上在做什么。你的程序集之间是否有继承关系?也就是说,你能否添加一个引用到定义了业务程序集接口的程序集中? - Rup
1个回答

9
我假设你的程序集中包含一个或多个 IUser 接口的实现。当你运行以下代码时:
 builder.RegisterAssemblyTypes(services);

如果没有任何额外的参数,你实际上是通过类别注册了该程序集中的所有类型。你可能会发现这种解析方法有效:

GetInstance<SomeSpecificUserImplementation>();

为了通过接口来对您的服务进行分类,只需按照以下步骤操作:
  builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();

现在您的所有服务将由其实现的接口进行标识,而不是特定的类,因此以下操作将起作用:
GetInstance<IUser>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接