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中的对象和服务会及时发生变化.
谢谢
我假设您的程序集包含一个或多个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)
| 归档时间: |
|
| 查看次数: |
6775 次 |
| 最近记录: |