-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStartup.cs
104 lines (89 loc) · 3.33 KB
/
Startup.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using AutoMapper;
using Microsoft.AspNet.OData.Batch;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.AspNet.OData.Formatter.Deserialization;
using Microsoft.AspNet.OData.Routing.Conventions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OData;
using PacsNext.WebApi.Support;
using System.Collections.Generic;
using WidgetWebAPI.Domain;
using WidgetWebAPI.Support;
namespace WidgetWebAPI
{
public class Startup
{
#region Constructor(s)
public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
Configuration = configuration;
CurrentEnvironment = environment;
}
#endregion
#region Private Properties
private IConfiguration Configuration { get; }
private IWebHostEnvironment CurrentEnvironment { get; }
#endregion
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddOData();
services.AddControllers();
services.AddDbContext<Data.WidgetDBContext>(optionsBuilder =>
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(Configuration.GetConnectionString("Default"));
}
});
services
.AddAutoMapper(this.GetType().Assembly)
.AddScoped<DomainContext, DomainContext>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
// Add "UseODataBatching()" before "UseRouting()" to support OData $batch.
app.UseODataBatching();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
//endpoints.MapODataRoute("odata", "odata", new PropertyModelBuilder(app.ApplicationServices).GetEdmModel());
endpoints.MapODataRoute("odata", "odata",
b =>
{
b.AddService(Microsoft.OData.ServiceLifetime.Singleton,
sp => new DomainModelBuilder(app.ApplicationServices).GetEdmModel());
b.AddService<ODataDeserializerProvider>(Microsoft.OData.ServiceLifetime.Singleton,
sp => new EntityReferenceODataDeserializerProvider(sp));
b.AddService<ODataBatchHandler>(Microsoft.OData.ServiceLifetime.Singleton,
sp => new TransactionedODataBatchHandler());
b.AddService<IEnumerable<IODataRoutingConvention>>(Microsoft.OData.ServiceLifetime.Singleton,
sp =>
{
var routingConventions = ODataRoutingConventions.CreateDefaultWithAttributeRouting("odata", endpoints.ServiceProvider);
// THIS DOES NOT WORK:
// With attribute routing in place, this class no longer works. Running the app immediately throws an
// exception if I uncomment and attempt to use the [ODataRoute] attribute like this:
// [ODataRoute("Supplier({keySupplierId})/Part({keyPartId})")]
//routingConventions.Insert(0, new NavigationIndexRoutingConvention());
//routingConventions.Add(new NavigationIndexRoutingConvention());
return routingConventions;
});
});
});
}
}
}