Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 团结有时不能解决依赖问题_C#_Asp.net Web Api_Unity Container - Fatal编程技术网

C# 团结有时不能解决依赖问题

C# 团结有时不能解决依赖问题,c#,asp.net-web-api,unity-container,C#,Asp.net Web Api,Unity Container,我在使用Unity作为IOC容器时遇到了一个奇怪的问题,我不知道是什么导致了这个问题。我的webapi控制器中有一个服务依赖项,但它随机无法解决此依赖项。有时我不得不启动我的应用程序3到4次,然后它突然又工作了 我得到的错误是: 解析依赖项失败,type=“Base.WebApi.Controllers.ApiUsersController”,name=“(无)”。解析时发生异常。异常为:InvalidOperationException-类型IApiUserService没有可访问的构造函数。

我在使用Unity作为IOC容器时遇到了一个奇怪的问题,我不知道是什么导致了这个问题。我的webapi控制器中有一个服务依赖项,但它随机无法解决此依赖项。有时我不得不启动我的应用程序3到4次,然后它突然又工作了

我得到的错误是:

解析依赖项失败,type=“Base.WebApi.Controllers.ApiUsersController”,name=“(无)”。解析时发生异常。异常为:InvalidOperationException-类型IApiUserService没有可访问的构造函数。-------------------------------------发生异常时,容器为:Resolving Base.WebApi.Controllers.ApiUsersController,(无)正在解析构造函数Base.WebApi.Controllers.ApiUsersController(Base.BLL.Services.User.IApiUserService apiUserService)的参数“apiUserService”,正在解析Base.BLL.Services.User.IApiUserService,(无)

在unity中初始化和注册我的类型时,我使用以下方法:

公共静态无效注册表类型(IUnityContainer容器)
{
var myAssemblies=AppDomain.CurrentDomain.GetAssemblies()。其中(a=>a.FullName.StartsWith(“Base”)&&!a.FullName.StartsWith(“Base.WebApi”)。ToArray();
RegisterType(typeof(Startup));
container.RegisterTypes(
UnityHelpers.GetTypesWithCustomAttribute(MyAssembly),
使用Mappings.FromMatchingInterface,
WithName.Default,
在Lifetime.Container受控的情况下,
无效的
).注册表类型(
UnityHelpers.GetTypesWithCustomAttribute(MyAssembly),
使用Mappings.FromMatchingInterface,
WithName.Default,
使用寿命(瞬时);
}
如您所见,我正在使用单音和瞬态命名属性来定义解决依赖关系的方式

我的控制器如下所示:

公共类ApiUsersController:ODataController
{
私有只读IApiUserService\u apiUserService;
公共ApiUsersController(IApiUserService apiUserService)
{
_apiUserService=apiUserService;
}
公共IQueryable Get()
{
返回此项。_apiUserService.GetUsers();
}
}
如您所见,它依赖于用户服务,如下所示:

[UnityIoCTransientLifetimed]
公共类ApiUserService:BaseService、IApiUserService
{
专用只读IUserRepository\u userRepository;
公共ApiUserService(IUserRepository userRepository,IUnitOfWork uow):基本(uow)
{
_userRepository=userRepository;
}
}
api用户存储库如下所示:

[UnityIoCTransientLifetimed]
公共类UserRepository:GenericRepository,IUserRepository
{
公共用户存储库(IUnitOfWork unitOfWork,IDomainContext上下文):基本(unitOfWork,context)
{
}
扩展以下通用存储:

公共类GenericRepository:IGenericRepository其中T:class
{
受保护的只读BaseContext上下文;
公共通用存储库(IUnitOfWork unitOfWork,IBaseContext上下文)
{
//向工作单元注册此存储库。
工作单元。注册(本);
Context=(BaseContext)Context;
}
我的工作单元如下所示:

[UnityIoCSingletonLifetimed]
公共类UnitOfWork:IUnitOfWork
{
专用只读词典库;
//工作类单元负责创建存储库,然后在不再需要时处置它。
公共工作单元()
{
_存储库=新字典();
}
}

然而,它有时有效,有时无效,我不知道为什么或在哪里查找。

由于一些建议,最终解决了它。查看文档了解更多信息

AppDomain.CurrentDomain.GetAssemblys()
它说: 获取已加载到此应用程序域的执行上下文中的程序集

这基本上意味着它只在实际需要时加载程序集

我解决这个问题的方法是使用更可靠的getReferenceAssembly,它加载所有程序集,即使它们没有被使用


var allAssemblies=new ReadOnlyCollection

如果显式注册类型而不是按约定注册,是否有效?可能在
ApiUsersController
之前没有注册
IApiUserService
,这意味着它没有可注入该构造函数的类型。顺便问一下,您是否能够重新注册调试中的问题?如果是,是否可以检查AppDomain.CurrentDomain.GetAssemblys()返回的内容
?我怀疑原因可能是包含
ApiUserService
的程序集尚未加载。@RonBeyer,注册顺序无关紧要,只要在您尝试解析之前所有内容都已注册,我只是尝试明确地注册它们,自那以后它没有崩溃过一次。重新启动了大约5/6次。看起来是这样的在GetAssemblys部分中。