Skip to content

Commit 3664d39

Browse files
author
Chris Santero
committed
change autofac configuration interface
1 parent 6e5fcd5 commit 3664d39

File tree

6 files changed

+115
-92
lines changed

6 files changed

+115
-92
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Web.Http;
2+
using Autofac;
3+
using Autofac.Integration.WebApi;
4+
using JSONAPI.Core;
5+
6+
namespace JSONAPI.Autofac
7+
{
8+
public static class HttpConfigurationExtensions
9+
{
10+
public static void UseJsonApiWithAutofac(this HttpConfiguration httpConfig, IContainer applicationContainer)
11+
{
12+
var jsonApiConfiguration = applicationContainer.Resolve<JsonApiHttpConfiguration>();
13+
jsonApiConfiguration.Apply(httpConfig);
14+
httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(applicationContainer);
15+
}
16+
}
17+
}

JSONAPI.Autofac/JSONAPI.Autofac.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@
5959
<Reference Include="System.Xml" />
6060
</ItemGroup>
6161
<ItemGroup>
62+
<Compile Include="HttpConfigurationExtensions.cs" />
6263
<Compile Include="JsonApiAutofacConfiguration.cs" />
64+
<Compile Include="JsonApiAutofacModule.cs" />
6365
<Compile Include="Properties\AssemblyInfo.cs" />
6466
</ItemGroup>
6567
<ItemGroup>
Lines changed: 3 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Web.Http;
4-
using Autofac;
5-
using JSONAPI.ActionFilters;
3+
using Autofac.Core;
64
using JSONAPI.Core;
7-
using JSONAPI.Json;
85
using JSONAPI.Payload;
9-
using JSONAPI.Payload.Builders;
106

117
namespace JSONAPI.Autofac
128
{
139
public class JsonApiAutofacConfiguration
1410
{
1511
private readonly INamingConventions _namingConventions;
1612
private readonly List<Type> _typesToRegister;
17-
private readonly List<Action<ContainerBuilder>> _containerBuildingActions;
1813
private ILinkConventions _linkConventions;
1914

2015
public JsonApiAutofacConfiguration(INamingConventions namingConventions)
@@ -23,7 +18,6 @@ public JsonApiAutofacConfiguration(INamingConventions namingConventions)
2318

2419
_namingConventions = namingConventions;
2520
_typesToRegister = new List<Type>();
26-
_containerBuildingActions = new List<Action<ContainerBuilder>>();
2721
}
2822

2923
public void RegisterResourceType(Type resourceType)
@@ -36,71 +30,9 @@ public void OverrideLinkConventions(ILinkConventions linkConventions)
3630
_linkConventions = linkConventions;
3731
}
3832

39-
public void OnContainerBuilding(Action<ContainerBuilder> action)
33+
public IModule GetAutofacModule()
4034
{
41-
_containerBuildingActions.Add(action);
42-
}
43-
44-
public IContainer Apply(HttpConfiguration httpConfig)
45-
{
46-
var container = GetContainer();
47-
var jsonApiConfiguration = container.Resolve<JsonApiHttpConfiguration>();
48-
jsonApiConfiguration.Apply(httpConfig);
49-
return container;
50-
}
51-
52-
private IContainer GetContainer()
53-
{
54-
var builder = new ContainerBuilder();
55-
56-
// Registry
57-
builder.Register(c => _namingConventions).As<INamingConventions>().SingleInstance();
58-
builder.RegisterType<ResourceTypeRegistry>().AsSelf().SingleInstance();
59-
builder.Register(c =>
60-
{
61-
var registry = c.Resolve<ResourceTypeRegistry>();
62-
foreach (var type in _typesToRegister)
63-
registry.RegisterResourceType(type);
64-
return registry;
65-
}).As<IResourceTypeRegistry>().SingleInstance();
66-
67-
// Serialization
68-
builder.RegisterType<MetadataSerializer>().As<IMetadataSerializer>().SingleInstance();
69-
builder.RegisterType<LinkSerializer>().As<ILinkSerializer>().SingleInstance();
70-
builder.RegisterType<ResourceLinkageSerializer>().As<IResourceLinkageSerializer>().SingleInstance();
71-
builder.RegisterType<RelationshipObjectSerializer>().As<IRelationshipObjectSerializer>().SingleInstance();
72-
builder.RegisterType<ResourceObjectSerializer>().As<IResourceObjectSerializer>().SingleInstance();
73-
builder.RegisterType<SingleResourcePayloadSerializer>().As<ISingleResourcePayloadSerializer>().SingleInstance();
74-
builder.RegisterType<ResourceCollectionPayloadSerializer>().As<IResourceCollectionPayloadSerializer>().SingleInstance();
75-
builder.RegisterType<ErrorSerializer>().As<IErrorSerializer>().SingleInstance();
76-
builder.RegisterType<ErrorPayloadSerializer>().As<IErrorPayloadSerializer>().SingleInstance();
77-
78-
// Queryable transforms
79-
builder.RegisterType<SynchronousEnumerationTransformer>().As<IQueryableEnumerationTransformer>().SingleInstance();
80-
builder.RegisterType<DefaultFilteringTransformer>().As<IQueryableFilteringTransformer>().SingleInstance();
81-
builder.RegisterType<DefaultSortingTransformer>().As<IQueryableSortingTransformer>().SingleInstance();
82-
builder.RegisterType<DefaultPaginationTransformer>().As<IQueryablePaginationTransformer>().SingleInstance();
83-
84-
// Payload building
85-
var linkConventions = _linkConventions ?? new DefaultLinkConventions();
86-
builder.Register(c => linkConventions).As<ILinkConventions>().SingleInstance();
87-
builder.RegisterType<JsonApiFormatter>().SingleInstance();
88-
builder.RegisterType<RegistryDrivenResourceCollectionPayloadBuilder>().As<IResourceCollectionPayloadBuilder>().SingleInstance();
89-
builder.RegisterType<RegistryDrivenSingleResourcePayloadBuilder>().As<ISingleResourcePayloadBuilder>().SingleInstance();
90-
builder.RegisterType<FallbackPayloadBuilder>().As<IFallbackPayloadBuilder>().SingleInstance();
91-
builder.RegisterType<ErrorPayloadBuilder>().As<IErrorPayloadBuilder>().SingleInstance();
92-
builder.RegisterType<FallbackPayloadBuilderAttribute>().SingleInstance();
93-
builder.RegisterType<JsonApiExceptionFilterAttribute>().SingleInstance();
94-
builder.RegisterType<DefaultQueryableResourceCollectionPayloadBuilder>().As<IQueryableResourceCollectionPayloadBuilder>();
95-
96-
builder.RegisterType<JsonApiHttpConfiguration>();
97-
98-
foreach (var containerBuildingAction in _containerBuildingActions)
99-
{
100-
containerBuildingAction(builder);
101-
}
102-
103-
return builder.Build();
35+
return new JsonApiAutofacModule(_namingConventions, _linkConventions, _typesToRegister);
10436
}
10537
}
10638
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Autofac;
4+
using JSONAPI.ActionFilters;
5+
using JSONAPI.Core;
6+
using JSONAPI.Json;
7+
using JSONAPI.Payload;
8+
using JSONAPI.Payload.Builders;
9+
10+
namespace JSONAPI.Autofac
11+
{
12+
public class JsonApiAutofacModule : Module
13+
{
14+
private readonly INamingConventions _namingConventions;
15+
private readonly ILinkConventions _linkConventions;
16+
private readonly IEnumerable<Type> _typesToRegister;
17+
18+
public JsonApiAutofacModule(INamingConventions namingConventions, ILinkConventions linkConventions, IEnumerable<Type> typesToRegister)
19+
{
20+
_namingConventions = namingConventions;
21+
_linkConventions = linkConventions;
22+
_typesToRegister = typesToRegister;
23+
}
24+
25+
protected override void Load(ContainerBuilder builder)
26+
{
27+
// Registry
28+
builder.Register(c => _namingConventions).As<INamingConventions>().SingleInstance();
29+
builder.RegisterType<ResourceTypeRegistry>().AsSelf().SingleInstance();
30+
builder.Register(c =>
31+
{
32+
var registry = c.Resolve<ResourceTypeRegistry>();
33+
foreach (var type in _typesToRegister)
34+
registry.RegisterResourceType(type);
35+
return registry;
36+
}).As<IResourceTypeRegistry>().SingleInstance();
37+
38+
builder.RegisterType<JsonApiHttpConfiguration>();
39+
40+
// Serialization
41+
builder.RegisterType<MetadataSerializer>().As<IMetadataSerializer>().SingleInstance();
42+
builder.RegisterType<LinkSerializer>().As<ILinkSerializer>().SingleInstance();
43+
builder.RegisterType<ResourceLinkageSerializer>().As<IResourceLinkageSerializer>().SingleInstance();
44+
builder.RegisterType<RelationshipObjectSerializer>().As<IRelationshipObjectSerializer>().SingleInstance();
45+
builder.RegisterType<ResourceObjectSerializer>().As<IResourceObjectSerializer>().SingleInstance();
46+
builder.RegisterType<SingleResourcePayloadSerializer>().As<ISingleResourcePayloadSerializer>().SingleInstance();
47+
builder.RegisterType<ResourceCollectionPayloadSerializer>().As<IResourceCollectionPayloadSerializer>().SingleInstance();
48+
builder.RegisterType<ErrorSerializer>().As<IErrorSerializer>().SingleInstance();
49+
builder.RegisterType<ErrorPayloadSerializer>().As<IErrorPayloadSerializer>().SingleInstance();
50+
51+
// Queryable transforms
52+
builder.RegisterType<SynchronousEnumerationTransformer>().As<IQueryableEnumerationTransformer>().SingleInstance();
53+
builder.RegisterType<DefaultFilteringTransformer>().As<IQueryableFilteringTransformer>().SingleInstance();
54+
builder.RegisterType<DefaultSortingTransformer>().As<IQueryableSortingTransformer>().SingleInstance();
55+
builder.RegisterType<DefaultPaginationTransformer>().As<IQueryablePaginationTransformer>().SingleInstance();
56+
57+
// Payload building
58+
var linkConventions = _linkConventions ?? new DefaultLinkConventions();
59+
builder.Register(c => linkConventions).As<ILinkConventions>().SingleInstance();
60+
builder.RegisterType<JsonApiFormatter>().SingleInstance();
61+
builder.RegisterType<RegistryDrivenResourceCollectionPayloadBuilder>().As<IResourceCollectionPayloadBuilder>().SingleInstance();
62+
builder.RegisterType<RegistryDrivenSingleResourcePayloadBuilder>().As<ISingleResourcePayloadBuilder>().SingleInstance();
63+
builder.RegisterType<FallbackPayloadBuilder>().As<IFallbackPayloadBuilder>().SingleInstance();
64+
builder.RegisterType<ErrorPayloadBuilder>().As<IErrorPayloadBuilder>().SingleInstance();
65+
builder.RegisterType<FallbackPayloadBuilderAttribute>().SingleInstance();
66+
builder.RegisterType<JsonApiExceptionFilterAttribute>().SingleInstance();
67+
builder.RegisterType<DefaultQueryableResourceCollectionPayloadBuilder>().As<IQueryableResourceCollectionPayloadBuilder>();
68+
69+
}
70+
}
71+
}

JSONAPI.EntityFramework.Tests.TestWebApp/Startup.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,6 @@ public void Configuration(IAppBuilder app)
4949
var namingConventions = new DefaultNamingConventions(pluralizationService);
5050

5151
var configuration = new JsonApiAutofacConfiguration(namingConventions);
52-
configuration.OnContainerBuilding(builder =>
53-
{
54-
builder.RegisterType<EntityFrameworkPayloadMaterializer>()
55-
.WithParameter("apiBaseUrl", "https://www.example.com")
56-
.As<IPayloadMaterializer>();
57-
builder.Register(c => HttpContext.Current.GetOwinContext()).As<IOwinContext>();
58-
builder.Register(c => c.Resolve<IOwinContext>().Get<TestDbContext>(DbContextKey)).AsSelf().As<DbContext>();
59-
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
60-
});
6152
configuration.RegisterResourceType(typeof(City));
6253
configuration.RegisterResourceType(typeof(Comment));
6354
configuration.RegisterResourceType(typeof(Post));
@@ -66,18 +57,27 @@ public void Configuration(IAppBuilder app)
6657
configuration.RegisterResourceType(typeof(Tag));
6758
configuration.RegisterResourceType(typeof(User));
6859
configuration.RegisterResourceType(typeof(UserGroup));
60+
var module = configuration.GetAutofacModule();
61+
62+
var containerBuilder = new ContainerBuilder();
63+
containerBuilder.RegisterModule(module);
64+
containerBuilder.RegisterType<EntityFrameworkPayloadMaterializer>()
65+
.WithParameter("apiBaseUrl", "https://www.example.com")
66+
.As<IPayloadMaterializer>();
67+
containerBuilder.Register(c => HttpContext.Current.GetOwinContext()).As<IOwinContext>();
68+
containerBuilder.Register(c => c.Resolve<IOwinContext>().Get<TestDbContext>(DbContextKey)).AsSelf().As<DbContext>();
69+
containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
70+
var container = containerBuilder.Build();
6971

7072
var httpConfig = new HttpConfiguration
7173
{
7274
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
7375
};
76+
httpConfig.UseJsonApiWithAutofac(container);
7477

7578
// Web API routes
7679
httpConfig.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new { id = RouteParameter.Optional });
7780

78-
var container = configuration.Apply(httpConfig);
79-
80-
//var appContainerBuilder = new ContainerBuilder();
8181
app.UseAutofacMiddleware(container);
8282

8383
httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container);

JSONAPI.TodoMVC.API/Startup.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,23 @@ public void Configuration(IAppBuilder app)
2020

2121
private static HttpConfiguration GetWebApiConfiguration()
2222
{
23+
var httpConfig = new HttpConfiguration();
24+
2325
var pluralizationService = new PluralizationService();
2426
pluralizationService.AddMapping("todo", "todos");
2527
var namingConventions = new DefaultNamingConventions(pluralizationService);
2628

27-
var httpConfig = new HttpConfiguration();
2829
var configuration = new JsonApiAutofacConfiguration(namingConventions);
2930
configuration.RegisterResourceType(typeof(Todo));
30-
configuration.OnContainerBuilding(builder =>
31-
{
32-
builder.RegisterType<EntityFrameworkPayloadMaterializer>()
33-
.WithParameter("apiBaseUrl", "https://www.example.com")
34-
.As<IPayloadMaterializer>();
35-
});
36-
var container = configuration.Apply(httpConfig);
31+
var module = configuration.GetAutofacModule();
3732

38-
httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container);
33+
var containerBuilder = new ContainerBuilder();
34+
containerBuilder.RegisterModule(module);
35+
containerBuilder.RegisterType<EntityFrameworkPayloadMaterializer>()
36+
.WithParameter("apiBaseUrl", "https://www.example.com")
37+
.As<IPayloadMaterializer>();
38+
var container = containerBuilder.Build();
39+
httpConfig.UseJsonApiWithAutofac(container);
3940

4041
// Web API routes
4142
httpConfig.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new { id = RouteParameter.Optional });

0 commit comments

Comments
 (0)