C# 请求的服务尚未注册
我正在尝试调用我的存储库,但遇到以下Autofac错误: 请求的服务“DOL.DTLLicense.DataAccess.Repositories.ApplicationTypeRepository”尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项 我猜我的邮箱有问题,但我不确定我遗漏了什么。我正在绑定我的存储库。任何帮助都将不胜感激 这是我的简历:C# 请求的服务尚未注册,c#,asp.net-mvc-5,autofac,C#,Asp.net Mvc 5,Autofac,我正在尝试调用我的存储库,但遇到以下Autofac错误: 请求的服务“DOL.DTLLicense.DataAccess.Repositories.ApplicationTypeRepository”尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项 我猜我的邮箱有问题,但我不确定我遗漏了什么。我正在绑定我的存储库。任何帮助都将不胜感激 这是我的简历: public static void Reg
public static void RegisterDependencies()
{
var builder = new ContainerBuilder();
// Register MVC Controllers
builder.RegisterControllers(typeof(MvcApplication).Assembly);
// Bind all repositories to Ef repos (entity framework)
builder.RegisterAssemblyTypes(typeof(DataAccess.Repositories.ApplicationRepository).Assembly)
.Where(repo => repo.Name.EndsWith("Repository"))
.WithParameter("connectionstring", Environment.MachineName)
.AsImplementedInterfaces()
.AsSelf();
// Unit of Work
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(ApplicationBusiness).Assembly)
.Where(b => b.Name.EndsWith("Business"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterType<ApplicationViewModelBuilder>().As<IApplicationViewModelBuilder>().InstancePerRequest();
builder.RegisterType<ApplicationCommand>().As<IApplicationCommand>().InstancePerRequest();
// Enable property injection into action filters
builder.RegisterFilterProvider();
DependencyResolver.SetResolver(new AutofacDependencyResolver(builder.Build()));
}
publicstaticvoidregisterDependencies()
{
var builder=new ContainerBuilder();
//注册MVC控制器
注册控制器(类型化(MVCAPApplication).Assembly);
//将所有存储库绑定到Ef repos(实体框架)
RegisterAssemblyTypes(typeof(DataAccess.Repositories.ApplicationRepository.Assembly)
.Where(repo=>repo.Name.EndsWith(“存储库”))
.WithParameter(“connectionstring”,Environment.MachineName)
.AsImplementedInterfaces()
.AsSelf();
//工作单位
builder.RegisterType().As().InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(ApplicationBusiness).Assembly)
.Where(b=>b.Name.EndsWith(“业务”))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
//将属性注入到操作筛选器中
builder.RegisterFilterProvider();
SetResolver(新的AutofacDependencyResolver(builder.Build());
}
ViewModelBuilder:
public class ApplicationViewModelBuilder : IApplicationViewModelBuilder
{
private readonly IApplicationBusiness _applicationBusiness;
private readonly IApplicationTypeBusiness _applicationTypeBusiness;
public ApplicationViewModelBuilder(IApplicationBusiness applicationBusiness, IApplicationTypeBusiness applicationTypeBusiness)
{
_applicationBusiness = applicationBusiness;
_applicationTypeBusiness = applicationTypeBusiness;
}
public ApplicationApplyNowViewModel BuildApplyNow()
{
IEnumerable<SelectListItem> applicationTypes = SetApplicationTypesDropdown();
var vm = new ApplicationApplyNowViewModel(applicationTypes);
return vm;
}
}
公共类ApplicationViewModelBuilder:IAApplicationViewModelBuilder
{
私有只读IApplicationBusiness\u applicationBusiness;
私有只读IApplicationTypeBusiness\u applicationTypeBusiness;
公共应用程序ViewModelBuilder(IAApplicationBusiness应用程序业务,IAApplicationTypeBusiness应用程序TypeBusiness)
{
_applicationBusiness=applicationBusiness;
_applicationTypeBusiness=applicationTypeBusiness;
}
公共应用程序ApplyNowViewModel BuildApplyNow()
{
IEnumerable applicationTypes=SetApplicationTypesDropdown();
var vm=新的ApplicationApplyNowViewModel(applicationTypes);
返回虚拟机;
}
}
服务层:
public class ApplicationTypeBusiness : BusinessBase, IApplicationTypeBusiness
{
private readonly Logger _logger = LogManager.GetLogger(typeof(ApplicationTypeBusiness).FullName);
private readonly IApplicationTypeRepository applicationTypeRepository;
public ApplicationTypeBusiness(IUnitOfWork unitOfWork)
{
applicationTypeRepository = unitOfWork.GetRepository<ApplicationTypeRepository>();
}
public IEnumerable<ApplicationType> GetAll()
{
return applicationTypeRepository.GetAll();
}
public ApplicationType GetApplicationType(int applicationTypeId)
{
return applicationTypeRepository.GetApplicationType(applicationTypeId);
}
}
公共类ApplicationTypeBusiness:BusinessBase,IAApplicationTypeBusiness
{
私有只读记录器_Logger=LogManager.GetLogger(typeof(ApplicationTypeBusiness).FullName);
私有只读IAApplicationTypeRepository applicationTypeRepository;
公共应用程序类型业务(IUnitOfWork unitOfWork)
{
applicationTypeRepository=unitOfWork.GetRepository();
}
公共IEnumerable GetAll()
{
返回applicationTypeRepository.GetAll();
}
公共应用程序类型GetApplicationType(int applicationTypeId)
{
返回applicationTypeRepository.GetApplicationType(applicationTypeId);
}
}
工作单位:
public class UnitOfWork : IUnitOfWork
{
private readonly SqlContext _context;
public UnitOfWork() : this(new SqlContext()) { }
public UnitOfWork(SqlContext context)
{
_context = context;
}
public T GetRepository<T>() where T : class
{
var builder = new ContainerBuilder();
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
var result = scope.Resolve<T>(new NamedParameter("context", _context));
if (result != null && result.GetType().GetInterfaces().Contains(typeof(ICompanyRepository)))
return result;
}
return null;
}
public void Commit()
{
_context.SaveChanges();
}
public void Rollback()
{
_context
.ChangeTracker
.Entries()
.ToList()
.ForEach(x => x.Reload());
}
public void Dispose()
{
if (_context != null)
{
_context.Dispose();
}
}
}
公共类UnitOfWork:IUnitOfWork
{
私有只读SqlContext _context;
公共UnitOfWork():此(新SqlContext()){}
公共UnitOfWork(SqlContext上下文)
{
_上下文=上下文;
}
public T GetRepository(),其中T:class
{
var builder=new ContainerBuilder();
RegisterAssemblyModule(Assembly.getExecutionGassembly());
var container=builder.Build();
使用(var scope=container.BeginLifetimeScope())
{
var result=scope.Resolve(新名称参数(“上下文”),_context);
如果(result!=null&&result.GetType().GetInterfaces()包含(typeof(ICompanyRepository)))
返回结果;
}
返回null;
}
公共无效提交()
{
_SaveChanges();
}
公共无效回滚()
{
_上下文
.ChangeTracker
.条目()
托利斯先生()
.ForEach(x=>x.Reload());
}
公共空间处置()
{
如果(_context!=null)
{
_context.Dispose();
}
}
}
将私有字段添加到您的工作单元中
:
private readonly IComponentContext _componentContext;
将其注入构造函数:
public UnitOfWork(SqlContext context, IComponentContext componentContext)
{
_context = context;
_componentContext = componentContext;
}
然后从中决定:
public T GetRepository<T>() where T : class
{
var result = _componentContext.Resolve<T>(new NamedParameter("context", _context));
if (result != null && result.GetType().GetInterfaces().Contains(typeof(ICompanyRepository)))
{
return result;
}
return null;
}
public T GetRepository(),其中T:class
{
var result=_componentContext.Resolve(新名称参数(“context”),_context);
如果(result!=null&&result.GetType().GetInterfaces()包含(typeof(ICompanyRepository)))
{
返回结果;
}
返回null;
}
您的UnitOfWork正在创建一个新容器,而不是使用现有容器。如果您插入一个IComponentContext
并从中解析,则会更好。您还可以从生命周期范围解析,该生命周期范围在对象使用完毕之前结束。使用超出其作用域的对象可能会导致容器试图垃圾收集该对象。@艾米,谢谢你,你能给我举个例子吗?我还想指出,你的T GetRepository(),其中T:class
方法是服务定位器反模式。你建议不要这样做吗?我正在看这篇文章:如果使用DI,直接在需要的地方注入存储库通常会更好。但有时这是不可行的,服务定位器是必要的。我不知道这里的情况是否如此。我还要补充一点,并不是每个人都同意服务定位器是反模式的。我是否也需要更新这一行<代码>公共UnitOfWork():这(新的SqlContext()){}是的。第二个参数为Null。虽然如果使用此构造函数实例化工作单元,您将无法解析组件。哪个应该是鳍