我正在尝试注册一个名为“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中的对象和服务会及时发生变化。
由于
答案 0 :(得分:8)
我假设您的程序集包含IUser
接口的一个或多个实现。现在,当你运行:
builder.RegisterAssemblyTypes(services);
没有任何其他参数,您实际上正在注册该类按类键入的程序集中的所有类型。你可能会看到这个解决方案有效:
GetInstance<SomeSpecificUserImplementation>();
要通过界面键入您的服务,只需执行以下操作:
builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();
现在,所有服务都将通过它们实现的接口而非特定类来锁定,因此以下内容将起作用:
GetInstance<IUser>();