我正在尝试注册一个名为“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 中的对象和服务会随着时间发生变化。
谢谢
最佳答案
我假设您的程序集包含一个或多个 IUser
接口(interface)的实现。现在,当你运行时:
builder.RegisterAssemblyTypes(services);
如果没有任何附加参数,您实际上是在该程序集中注册了所有类型按类键控。您可能会看到此解决方案有效:
GetInstance<SomeSpecificUserImplementation>();
为了通过界面键控您的服务,只需执行以下操作:
builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();
现在您的所有服务都将由它们实现的接口(interface)而不是特定类作为键,因此以下内容将起作用:
GetInstance<IUser>();
关于c# - Autofac 使用 Assembly.Load 注册 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10530349/