fix: guard Matrix42 optional service resolution

This commit is contained in:
Meik
2026-06-26 12:25:14 +02:00
parent 9046b3f806
commit 4cc3ee7be5

View File

@@ -46,12 +46,57 @@ namespace C4IT.F4SD
public F4SDM42WebApiController(IDependencyResolver resolver)
{
defaultInstance = this;
_entityDataService = resolver?.TryGet<IEntityDataService>();
_journalService = resolver?.TryGet<IJournalService>();
_globalConfigurationProvider = GlobalConfigurationProvider.Instance;
_f4stHelperService = new F4SDHelperService();
_userProfile = resolver?.TryGet<IPandoraUserProfile>();
EnsureInitialized();
_entityDataService = ResolveOptional<IEntityDataService>(resolver);
_journalService = ResolveOptional<IJournalService>(resolver);
_userProfile = ResolveOptional<IPandoraUserProfile>(resolver);
}
private static T ResolveOptional<T>(IDependencyResolver resolver) where T : class
{
if (resolver == null)
return null;
try
{
if (!resolver.IsRegistered<T>())
return null;
}
catch
{
}
try
{
return resolver.TryGet<T>();
}
catch (Exception ex)
{
LogOptionalDependencyFailure(typeof(T), ex);
return null;
}
}
private static void LogOptionalDependencyFailure(Type dependencyType, Exception exception)
{
try
{
LogEntry($"Matrix42 dependency '{dependencyType.FullName}' could not be resolved.", LogLevels.Warning);
LogException(exception);
}
catch
{
}
}
private HttpResponseMessage CreateMissingDependencyResponse(Type dependencyType)
{
return HttpResponseExtensions.CreateResponse(
Request,
HttpStatusCode.ServiceUnavailable,
$"Matrix42 dependency '{dependencyType.FullName}' is not registered for this extension context.");
}
private static readonly object initLock = new object();
@@ -278,6 +323,9 @@ namespace C4IT.F4SD
public async Task<HttpResponseMessage> getPickup(string name, [FromUri] EntityEnumerationVisibilityMode mode = EntityEnumerationVisibilityMode.None, [FromUri] Int32 group = -1)
{
await Task.Delay(0);
if (_entityDataService == null)
return CreateMissingDependencyResponse(typeof(IEntityDataService));
EntityEnumeration enumerationTemp = _entityDataService.GetEnumeration(name, mode);
var vals = enumerationTemp.Values;
@@ -304,6 +352,9 @@ namespace C4IT.F4SD
[Route("getMyRoleMemberships"), HttpGet]
public async Task<HttpResponseMessage> getMyRoleMemberships()
{
if (_userProfile == null)
return CreateMissingDependencyResponse(typeof(IPandoraUserProfile));
var User = _userProfile.GetInteractiveUserInfo();
var filter = AsqlHelper.BuildInCondition("ID", new Guid[] { User.Id });
return HttpResponseExtensions.CreateResponse(Request, HttpStatusCode.OK, await _f4stHelperService.UserPermissionsInfo(filter));