diff --git a/AsbCloudApp/Data/TrajectoryDto.cs b/AsbCloudApp/Data/TrajectoryDto.cs new file mode 100644 index 00000000..80c965f4 --- /dev/null +++ b/AsbCloudApp/Data/TrajectoryDto.cs @@ -0,0 +1,13 @@ +namespace AsbCloudApp.Data +{ + /// + /// Формирование визуализации траектории 3D + /// + /// Глубина ствола + /// Зенитный угол + /// Азимут географиеский + public record TrajectoryDto( + double WellboreDepth, + double ZenithAngle, + double AzimuthGeo); +} diff --git a/AsbCloudApp/Repositories/IActualTrajectoryRepository.cs b/AsbCloudApp/Repositories/IActualTrajectoryRepository.cs new file mode 100644 index 00000000..76c1648d --- /dev/null +++ b/AsbCloudApp/Repositories/IActualTrajectoryRepository.cs @@ -0,0 +1,17 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.WITS; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories +{ + /// + /// CRUD для работы с фактической траекторией из клиента + /// + /// + public interface IActualTrajectoryRepository : ITrajectoryRepository + { + + } +} diff --git a/AsbCloudApp/Repositories/IPlannedTrajectoryRepository.cs b/AsbCloudApp/Repositories/IPlannedTrajectoryRepository.cs index 94f19162..85362f9f 100644 --- a/AsbCloudApp/Repositories/IPlannedTrajectoryRepository.cs +++ b/AsbCloudApp/Repositories/IPlannedTrajectoryRepository.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Repositories /// CRUD для работы с плановой траекторией из клиента /// /// - public interface IPlannedTrajectoryRepository + public interface IPlannedTrajectoryRepository : ITrajectoryRepository { /// /// Получить все добавленные по скважине координаты плановой траектории diff --git a/AsbCloudApp/Repositories/ITrajectoryRepository.cs b/AsbCloudApp/Repositories/ITrajectoryRepository.cs new file mode 100644 index 00000000..123f1669 --- /dev/null +++ b/AsbCloudApp/Repositories/ITrajectoryRepository.cs @@ -0,0 +1,24 @@ +using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories +{ + /// + /// Репозиторий по работе с траекторией + /// + public interface ITrajectoryRepository + { + /// + /// Получение траектории для 3D-визуализации + /// + /// ключ скважины + /// + /// + Task> GetTrajectoryAsync(int idWell, CancellationToken token); + } +} diff --git a/AsbCloudApp/Services/ITrajectoryVisualizationService.cs b/AsbCloudApp/Services/ITrajectoryVisualizationService.cs index 31d77271..286a81d5 100644 --- a/AsbCloudApp/Services/ITrajectoryVisualizationService.cs +++ b/AsbCloudApp/Services/ITrajectoryVisualizationService.cs @@ -11,11 +11,11 @@ namespace AsbCloudApp.Services public interface ITrajectoryVisualizationService { /// - /// Получение траектории по скважине + /// Получение плановой и фактической траектории по скважине /// - /// + /// ключ скважины /// /// - Task> GetTrajectoryAsync(int idWell, CancellationToken token); + Task>> GetTrajectoryAsync(int idWell, CancellationToken token); } } diff --git a/AsbCloudApp/Services/IUserSettingsRepository.cs b/AsbCloudApp/Services/IUserSettingsRepository.cs index b2287918..6849409d 100644 --- a/AsbCloudApp/Services/IUserSettingsRepository.cs +++ b/AsbCloudApp/Services/IUserSettingsRepository.cs @@ -25,7 +25,7 @@ namespace AsbCloudApp.Services /// /// /// - Task GetOrDefaultAsync(int userId, string key, CancellationToken token); + Task GetOrDefaultAsync(int userId, string key, CancellationToken token); /// /// Добавить или изменить настройки с ключем для пользователя diff --git a/AsbCloudDb/Model/WITS/Record7.cs b/AsbCloudDb/Model/WITS/Record7.cs index d856f8a7..0b768243 100644 --- a/AsbCloudDb/Model/WITS/Record7.cs +++ b/AsbCloudDb/Model/WITS/Record7.cs @@ -12,6 +12,7 @@ namespace AsbCloudDb.Model.WITS { /// + /// /// RecordId = 7, /// ItemId = 8, /// LongMnemonic = "DEPTSVYM", @@ -87,6 +88,7 @@ namespace AsbCloudDb.Model.WITS public string? Svytype { get; set; } /// + /// /// RecordId = 7, /// ItemId = 13, /// LongMnemonic = "SVYINC", @@ -117,6 +119,7 @@ namespace AsbCloudDb.Model.WITS public float? Svyazu { get; set; } /// + /// /// RecordId = 7, /// ItemId = 15, /// LongMnemonic = "SVYAZC", diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 7952b1f4..1911d5a8 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -180,6 +180,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); // Subsystem service diff --git a/AsbCloudInfrastructure/Repository/ActualTrajectoryRepository.cs b/AsbCloudInfrastructure/Repository/ActualTrajectoryRepository.cs new file mode 100644 index 00000000..b89c9cf8 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/ActualTrajectoryRepository.cs @@ -0,0 +1,46 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Repository +{ + internal class ActualTrajectoryRepository : IActualTrajectoryRepository + { + private readonly IAsbCloudDbContext db; + private readonly IWellService wellService; + public ActualTrajectoryRepository(IAsbCloudDbContext db, IWellService wellService) + { + this.db = db; + this.wellService = wellService; + } + + public async Task> GetTrajectoryAsync(int idWell, CancellationToken token) + { + + var well = wellService.GetOrDefault(idWell); + if (well is null || well.Timezone is null) + throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell)); + + var entities = await db.Record7 + .AsNoTracking() + .Where(x => x.IdTelemetry == well.IdTelemetry) + .Where(coord => coord.Deptsvym != null && coord.Svyinc != null && coord.Svyazc != null) + .OrderBy(e => e.Deptsvym) + .Select(x => new { x.Deptsvym, x.Svyinc, x.Svyazc }) + .ToArrayAsync(token); + + var result = entities + .Select(coord => new TrajectoryDto(coord.Deptsvym!.Value, coord.Svyinc!.Value, coord.Svyazc!.Value)) + .ToArray(); + + return result; + } + } +} diff --git a/AsbCloudInfrastructure/Repository/PlannedTrajectoryRepository.cs b/AsbCloudInfrastructure/Repository/PlannedTrajectoryRepository.cs index 0db7022d..d09b9690 100644 --- a/AsbCloudInfrastructure/Repository/PlannedTrajectoryRepository.cs +++ b/AsbCloudInfrastructure/Repository/PlannedTrajectoryRepository.cs @@ -86,7 +86,7 @@ namespace AsbCloudInfrastructure.Repository .Where(x => x.IdWell == idWell); var entities = await query .OrderBy(e => e.WellboreDepth) - .ToListAsync(token); + .ToArrayAsync(token); var result = entities .Select(r => Convert(r, offsetHours)); return result; @@ -115,6 +115,22 @@ namespace AsbCloudInfrastructure.Repository entity.UpdateDate = DateTime.Now.ToUtcDateTimeOffset(offsetHours); return entity; } + + public async Task> GetTrajectoryAsync(int idWell, CancellationToken token) + { + var well = wellService.GetOrDefault(idWell); + if (well is null || well.Timezone is null) + throw new ArgumentInvalidException("idWell doesn`t exist", nameof(idWell)); + + var query = db.PlannedTrajectories + .AsNoTracking() + .Where(x => x.IdWell == idWell); + + return await query + .Select(coord => new TrajectoryDto(coord.WellboreDepth, coord.ZenithAngle, coord.AzimuthGeo)) + .ToArrayAsync() + .ConfigureAwait(false); + } } } diff --git a/AsbCloudInfrastructure/Repository/UserSettingsRepository.cs b/AsbCloudInfrastructure/Repository/UserSettingsRepository.cs index f8451d02..8754b3c1 100644 --- a/AsbCloudInfrastructure/Repository/UserSettingsRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserSettingsRepository.cs @@ -16,7 +16,7 @@ namespace AsbCloudInfrastructure.Repository this.context = context; } - public Task GetOrDefaultAsync(int userId, string key, CancellationToken token) + public Task GetOrDefaultAsync(int userId, string key, CancellationToken token) => context.Set() .Where(s => s.IdUser == userId && s.Key == key) .Select(s => s.Value) diff --git a/AsbCloudInfrastructure/Services/Trajectory/TrajectoryVisualizationService.cs b/AsbCloudInfrastructure/Services/Trajectory/TrajectoryVisualizationService.cs index 8eb94b5a..7428cda2 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/TrajectoryVisualizationService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/TrajectoryVisualizationService.cs @@ -12,28 +12,53 @@ namespace AsbCloudInfrastructure.Services.Trajectory public class TrajectoryVisualizationService : ITrajectoryVisualizationService { - private readonly IPlannedTrajectoryRepository repository; + private readonly IPlannedTrajectoryRepository plannedRepository; + private readonly IActualTrajectoryRepository factualRepository; - public TrajectoryVisualizationService(IPlannedTrajectoryRepository repository) + public TrajectoryVisualizationService(IPlannedTrajectoryRepository plannedRepository, IActualTrajectoryRepository factualRepository) { - this.repository = repository; + this.plannedRepository = plannedRepository; + this.factualRepository = factualRepository; } - public async Task> GetTrajectoryAsync(int idWell, CancellationToken token) + /// + /// Получение плановой и фактической траектории по скважине + /// + /// ключ скважины + /// + /// + public async Task>> GetTrajectoryAsync(int idWell, CancellationToken token) { - var geoCoordinates = (await repository.GetAsync(idWell, token)).ToArray(); + var result = new PlanFactBase>(); - if (geoCoordinates.Length < 2) - return Enumerable.Empty(); + var geoPlanCoordinates = await plannedRepository.GetTrajectoryAsync(idWell, token); + var geoFactCoordinates = await factualRepository.GetTrajectoryAsync(idWell, token); - var cartesianCoordinates = new List(geoCoordinates.Length) { - new (), - }; + result.Plan = GetTrajectoryVisualisation(geoPlanCoordinates); + result.Fact = GetTrajectoryVisualisation(geoFactCoordinates); - for (var i = 1; i < geoCoordinates.Length; i++) + return result; + } + + /// + /// Формирует список координат для визуализации трактории 3D + /// + /// + /// + private IEnumerable GetTrajectoryVisualisation(IEnumerable geoCoordinates) + { + var geoCoordinatesLength = geoCoordinates.Count(); + if (geoCoordinatesLength < 2) + return new TrajectoryVisualizationDto[0]; + + var cartesianCoordinates = new TrajectoryVisualizationDto[geoCoordinatesLength]; + cartesianCoordinates[0] = new(); + + var geoCoordinatesArray = geoCoordinates.OrderBy(c => c.WellboreDepth).ToArray(); + for (var i = 1; i < geoCoordinatesLength; i++) { - var intervalGeoParams = geoCoordinates[i - 1]; - var deltaWellLength = geoCoordinates[i].WellboreDepth - intervalGeoParams.WellboreDepth; + var intervalGeoParams = geoCoordinatesArray[i - 1]; + var deltaWellLength = geoCoordinatesArray[i].WellboreDepth - intervalGeoParams.WellboreDepth; var projectionLengthToXYSurface = deltaWellLength * Math.Sin(intervalGeoParams.ZenithAngle * Math.PI / 180); var dz = deltaWellLength * Math.Cos(intervalGeoParams.ZenithAngle * Math.PI / 180); @@ -48,7 +73,7 @@ namespace AsbCloudInfrastructure.Services.Trajectory Y = preCoordinates.Y + dy, }; - cartesianCoordinates.Add(coordinates); + cartesianCoordinates[i] = coordinates; } return cartesianCoordinates; diff --git a/AsbCloudWebApi.Tests/ServicesTests/TrajectoryVisualizationServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/TrajectoryVisualizationServiceTest.cs index f4532d7c..1a0dab1b 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/TrajectoryVisualizationServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/TrajectoryVisualizationServiceTest.cs @@ -1,9 +1,8 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.WITS; using AsbCloudApp.Repositories; -using AsbCloudInfrastructure.Services; using AsbCloudInfrastructure.Services.Trajectory; using Moq; -using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -14,11 +13,12 @@ namespace AsbCloudWebApi.Tests.ServicesTests { public class TrajectoryVisualizationServiceTest { - private Mock MakePlannedTrajectoryRepositoryMock(IEnumerable dateForGetMethod) + private Mock MakeTrajectoryRepositoryMock(IEnumerable dateForGetMethod) + where T : class, ITrajectoryRepository { - var mock = new Mock(); + var mock = new Mock(); - mock.Setup(r => r.GetAsync(It.IsAny(), It.IsAny())) + mock.Setup(r => r.GetTrajectoryAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(dateForGetMethod)); return mock; @@ -27,65 +27,86 @@ namespace AsbCloudWebApi.Tests.ServicesTests [Fact] public async Task GetTrajectoryAsync_SameCounts() { - var plannedTrajectory = new PlannedTrajectoryDto[] + var plannedTrajectory = new TrajectoryDto[] { - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 0d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 10d}, - new() { AzimuthGeo = 0d, ZenithAngle = 30d, WellboreDepth = 20d}, - new() { AzimuthGeo = 30d, ZenithAngle = 0d, WellboreDepth = 30d}, - new() { AzimuthGeo = 30d, ZenithAngle = 90d, WellboreDepth = 40d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 50d}, + new(0d, 0d, 0d), + new(0d, 0d, 10d), + new(0d, 30d, 20d), + new(30d, 0d, 30d), + new(30d, 90d, 40d), + new(0d, 0d, 50d), }; - var mock = MakePlannedTrajectoryRepositoryMock(plannedTrajectory); - var service = new TrajectoryVisualizationService(mock.Object); - var result = await service.GetTrajectoryAsync(1, CancellationToken.None); + var actualTrajectory = new TrajectoryDto[] + { + new(0, 0, 0), + new(30,30,10), + new(0, 0, 20), + }; - Assert.Equal(plannedTrajectory.Length, result.Count()); + var mockPlan = MakeTrajectoryRepositoryMock(plannedTrajectory); + var mockFact = MakeTrajectoryRepositoryMock(actualTrajectory); + var service = new TrajectoryVisualizationService(mockPlan.Object, mockFact.Object); + var result = await service.GetTrajectoryAsync(1, CancellationToken.None); + Assert.Equal(plannedTrajectory.Length, result.Plan?.Count()); + Assert.Equal(actualTrajectory.Length, result.Fact?.Count()); } [Fact] public async Task GetTrajectoryAsync_StraigthBore() { - var plannedTrajectory = new PlannedTrajectoryDto[] + var trajectory = new TrajectoryDto[] { - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 0d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 0d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 20d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 20d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 30d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 50d}, + new(0, 0, 0), + new(0, 0, 0), + new(20, 0, 0), + new(20, 0, 0), + new(30, 0, 0), + new(50, 0, 0), }; - var mock = MakePlannedTrajectoryRepositoryMock(plannedTrajectory); - var service = new TrajectoryVisualizationService(mock.Object); + var mockPlan = MakeTrajectoryRepositoryMock(trajectory); + var mockFact = MakeTrajectoryRepositoryMock(trajectory); + var service = new TrajectoryVisualizationService(mockPlan.Object, mockFact.Object); var result = await service.GetTrajectoryAsync(1, CancellationToken.None); - var lastPoint = result.Last(); + var lastPointPlan = result.Plan!.Last(); + var lastPointFact = result.Fact!.Last(); - Assert.Equal(0d, lastPoint.X, 0.1d); - Assert.Equal(0d, lastPoint.Y, 0.1d); - Assert.Equal(50d, lastPoint.Z, 0.1d); + Assert.Equal(0d, lastPointPlan.X, 0.1d); + Assert.Equal(0d, lastPointPlan.Y, 0.1d); + Assert.Equal(50d, lastPointPlan.Z, 0.1d); + + Assert.Equal(0d, lastPointFact.X, 0.1d); + Assert.Equal(0d, lastPointFact.Y, 0.1d); + Assert.Equal(50d, lastPointFact.Z, 0.1d); } [Fact] public async Task GetTrajectoryAsync_Match() { - var plannedTrajectory = new PlannedTrajectoryDto[] + var trajectory = new TrajectoryDto[] { - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 0d}, - new() { AzimuthGeo = 30d, ZenithAngle = 30d, WellboreDepth = 10d}, - new() { AzimuthGeo = 0d, ZenithAngle = 0d, WellboreDepth = 20d}, + new(0, 0, 0), + new(10, 30, 30), + new(20, 0, 0), }; - var mock = MakePlannedTrajectoryRepositoryMock(plannedTrajectory); - var service = new TrajectoryVisualizationService(mock.Object); + var mockPlanned = MakeTrajectoryRepositoryMock(trajectory); + var mockFactual = MakeTrajectoryRepositoryMock(trajectory); + var service = new TrajectoryVisualizationService(mockPlanned.Object, mockFactual.Object); var result = await service.GetTrajectoryAsync(1, CancellationToken.None); - var lastPoint = result.Last(); - var tolerance = 0.001d; + var lastPointPlan = result.Plan!.Last(); + var lastPointFact = result.Fact!.Last(); + var tolerancePlan = 0.001d; + var toleranceFact = 0.001d; - Assert.InRange(lastPoint.Z, 10 + tolerance, 20 - tolerance); - Assert.InRange(lastPoint.Y, 0 + tolerance, 10 - tolerance); - Assert.InRange(lastPoint.X, 0 + tolerance, 10 - tolerance); + Assert.InRange(lastPointPlan.Z, 10 + tolerancePlan, 20 - tolerancePlan); + Assert.InRange(lastPointPlan.Y, 0 + tolerancePlan, 10 - tolerancePlan); + Assert.InRange(lastPointPlan.X, 0 + tolerancePlan, 10 - tolerancePlan); + + Assert.InRange(lastPointFact.Z, 10 + toleranceFact, 20 - toleranceFact); + Assert.InRange(lastPointFact.Y, 0 + toleranceFact, 10 - toleranceFact); + Assert.InRange(lastPointFact.X, 0 + toleranceFact, 10 - toleranceFact); } } } diff --git a/AsbCloudWebApi/AsbCloudWebApi.csproj b/AsbCloudWebApi/AsbCloudWebApi.csproj index 4a1f5733..5f231625 100644 --- a/AsbCloudWebApi/AsbCloudWebApi.csproj +++ b/AsbCloudWebApi/AsbCloudWebApi.csproj @@ -6,6 +6,7 @@ true $(NoWarn);1591 80899ceb-210f-4f19-ac56-aa90a5d666d4 + enable diff --git a/AsbCloudWebApi/Controllers/PlannedTrajectoryController.cs b/AsbCloudWebApi/Controllers/PlannedTrajectoryController.cs index df564558..5d019e18 100644 --- a/AsbCloudWebApi/Controllers/PlannedTrajectoryController.cs +++ b/AsbCloudWebApi/Controllers/PlannedTrajectoryController.cs @@ -225,14 +225,14 @@ namespace AsbCloudWebApi.Controllers } /// - /// Получение координат для визуализации траектории + /// Получение координат для визуализации траектории (плановой и фактической) /// /// /// /// [HttpGet] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetTrajectoryAsync(int idWell, CancellationToken token) + [ProducesResponseType(typeof(PlanFactBase>), (int)System.Net.HttpStatusCode.OK)] + public async Task GetPlanFactTrajectoryAsync(int idWell, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index 244528a3..ee3ba8f3 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -145,7 +145,7 @@ namespace AsbCloudWebApi.Controllers.SAUB else { if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - (int)idWell, token).ConfigureAwait(false)) + idWell!.Value, token).ConfigureAwait(false)) return Forbid(); idsWells = new List { (int)idWell }; } diff --git a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs index dd9fff9f..589d8f9f 100644 --- a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs +++ b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs @@ -19,7 +19,7 @@ namespace AsbCloudWebApi.Middlewares { try { - await next?.Invoke(context); + await next.Invoke(context); } catch (ArgumentInvalidException ex) { diff --git a/AsbCloudWebApi/PermissionAttribute.cs b/AsbCloudWebApi/PermissionAttribute.cs index 7eeff776..1249b531 100644 --- a/AsbCloudWebApi/PermissionAttribute.cs +++ b/AsbCloudWebApi/PermissionAttribute.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; namespace AsbCloudWebApi { @@ -8,7 +9,7 @@ namespace AsbCloudWebApi { public static SortedSet Registered { get; } = new SortedSet(); - public string Name { get; set; } + public string Name { get; set; } = null!; /// /// Проверка наличия у пользователя разрешения с именем "{ControllerName}.{http_method}". diff --git a/AsbCloudWebApi/TraceListenerView.cs b/AsbCloudWebApi/TraceListenerView.cs deleted file mode 100644 index bda66d1c..00000000 --- a/AsbCloudWebApi/TraceListenerView.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Diagnostics; - -namespace AsbCloudWebApi -{ - public class TraceListenerView : TraceListener - { - public TraceListenerView() - { - Trace.Listeners.Add(this); - } - - public override void Write(object o) - { - base.Write(o); - } - - public override void Write(string message) - { - //throw new NotImplementedException(); - } - - public override void WriteLine(string message) - { - //throw new NotImplementedException(); - } - } -}