Skip to content
This repository was archived by the owner on Nov 20, 2018. It is now read-only.

Commit d565659

Browse files
committed
Merge pull request #420 from benaadams/Features-perf
Remove FeatureReference indirection
2 parents d28c6e1 + 1f4ca55 commit d565659

11 files changed

+362
-60
lines changed

src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs

+24-5
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,44 @@
1212

1313
namespace Microsoft.AspNet.Http.Authentication.Internal
1414
{
15-
public class DefaultAuthenticationManager : AuthenticationManager
15+
public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache
1616
{
1717
private readonly IFeatureCollection _features;
18-
private FeatureReference<IHttpAuthenticationFeature> _authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
19-
private FeatureReference<IHttpResponseFeature> _response = FeatureReference<IHttpResponseFeature>.Default;
18+
private int _cachedFeaturesRevision = -1;
19+
20+
private IHttpAuthenticationFeature _authentication;
21+
private IHttpResponseFeature _response;
2022

2123
public DefaultAuthenticationManager(IFeatureCollection features)
2224
{
2325
_features = features;
2426
}
2527

28+
void IFeatureCache.CheckFeaturesRevision()
29+
{
30+
if (_cachedFeaturesRevision != _features.Revision)
31+
{
32+
_authentication = null;
33+
_response = null;
34+
_cachedFeaturesRevision = _features.Revision;
35+
}
36+
}
37+
2638
private IHttpAuthenticationFeature HttpAuthenticationFeature
2739
{
28-
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
40+
get
41+
{
42+
return FeatureHelpers.GetOrCreateAndCache(
43+
this,
44+
_features,
45+
() => new HttpAuthenticationFeature(),
46+
ref _authentication);
47+
}
2948
}
3049

3150
private IHttpResponseFeature HttpResponseFeature
3251
{
33-
get { return _response.Fetch(_features); }
52+
get { return FeatureHelpers.GetAndCache(this, _features, ref _response); }
3453
}
3554

3655
public override IEnumerable<AuthenticationDescription> GetAuthenticationSchemes()

src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs

+30-5
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,51 @@
1010

1111
namespace Microsoft.AspNet.Http.Internal
1212
{
13-
public class DefaultConnectionInfo : ConnectionInfo
13+
public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache
1414
{
1515
private readonly IFeatureCollection _features;
16+
private int _cachedFeaturesRevision = -1;
1617

17-
private FeatureReference<IHttpConnectionFeature> _connection = FeatureReference<IHttpConnectionFeature>.Default;
18-
private FeatureReference<ITlsConnectionFeature> _tlsConnection = FeatureReference<ITlsConnectionFeature>.Default;
18+
private IHttpConnectionFeature _connection;
19+
private ITlsConnectionFeature _tlsConnection;
1920

2021
public DefaultConnectionInfo(IFeatureCollection features)
2122
{
2223
_features = features;
2324
}
2425

26+
void IFeatureCache.CheckFeaturesRevision()
27+
{
28+
if (_cachedFeaturesRevision != _features.Revision)
29+
{
30+
_connection = null;
31+
_tlsConnection = null;
32+
_cachedFeaturesRevision = _features.Revision;
33+
}
34+
}
35+
2536
private IHttpConnectionFeature HttpConnectionFeature
2637
{
27-
get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); }
38+
get
39+
{
40+
return FeatureHelpers.GetOrCreateAndCache(
41+
this,
42+
_features,
43+
() => new HttpConnectionFeature(),
44+
ref _connection);
45+
}
2846
}
2947

3048
private ITlsConnectionFeature TlsConnectionFeature
3149
{
32-
get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); }
50+
get
51+
{
52+
return FeatureHelpers.GetOrCreateAndCache(
53+
this,
54+
_features,
55+
() => new TlsConnectionFeature(),
56+
ref _tlsConnection);
57+
}
3358
}
3459

3560
public override IPAddress RemoteIpAddress

src/Microsoft.AspNet.Http/DefaultHttpContext.cs

+59-17
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,22 @@
1414

1515
namespace Microsoft.AspNet.Http.Internal
1616
{
17-
public class DefaultHttpContext : HttpContext
17+
public class DefaultHttpContext : HttpContext, IFeatureCache
1818
{
1919
private readonly HttpRequest _request;
2020
private readonly HttpResponse _response;
2121
private readonly ConnectionInfo _connection;
2222
private readonly AuthenticationManager _authenticationManager;
2323

24-
private FeatureReference<IItemsFeature> _items;
25-
private FeatureReference<IServiceProvidersFeature> _serviceProviders;
26-
private FeatureReference<IHttpAuthenticationFeature> _authentication;
27-
private FeatureReference<IHttpRequestLifetimeFeature> _lifetime;
28-
private FeatureReference<ISessionFeature> _session;
24+
private IItemsFeature _items;
25+
private IServiceProvidersFeature _serviceProviders;
26+
private IHttpAuthenticationFeature _authentication;
27+
private IHttpRequestLifetimeFeature _lifetime;
28+
private ISessionFeature _session;
2929
private WebSocketManager _websockets;
30+
3031
private IFeatureCollection _features;
32+
private int _cachedFeaturesRevision = -1;
3133

3234
public DefaultHttpContext()
3335
: this(new FeatureCollection())
@@ -43,37 +45,77 @@ public DefaultHttpContext(IFeatureCollection features)
4345
_response = new DefaultHttpResponse(this, features);
4446
_connection = new DefaultConnectionInfo(features);
4547
_authenticationManager = new DefaultAuthenticationManager(features);
48+
}
4649

47-
_items = FeatureReference<IItemsFeature>.Default;
48-
_serviceProviders = FeatureReference<IServiceProvidersFeature>.Default;
49-
_authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
50-
_lifetime = FeatureReference<IHttpRequestLifetimeFeature>.Default;
51-
_session = FeatureReference<ISessionFeature>.Default;
50+
void IFeatureCache.CheckFeaturesRevision()
51+
{
52+
if (_cachedFeaturesRevision !=_features.Revision)
53+
{
54+
_items = null;
55+
_serviceProviders = null;
56+
_authentication = null;
57+
_lifetime = null;
58+
_session = null;
59+
_cachedFeaturesRevision = _features.Revision;
60+
}
5261
}
5362

5463
IItemsFeature ItemsFeature
5564
{
56-
get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); }
65+
get
66+
{
67+
return FeatureHelpers.GetOrCreateAndCache(
68+
this,
69+
_features,
70+
() => new ItemsFeature(),
71+
ref _items);
72+
}
5773
}
5874

5975
IServiceProvidersFeature ServiceProvidersFeature
6076
{
61-
get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); }
77+
get
78+
{
79+
return FeatureHelpers.GetOrCreateAndCache(
80+
this,
81+
_features,
82+
() => new ServiceProvidersFeature(),
83+
ref _serviceProviders);
84+
}
6285
}
6386

6487
private IHttpAuthenticationFeature HttpAuthenticationFeature
6588
{
66-
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
89+
get
90+
{
91+
return FeatureHelpers.GetOrCreateAndCache(
92+
this,
93+
_features,
94+
() => new HttpAuthenticationFeature(),
95+
ref _authentication);
96+
}
6797
}
6898

6999
private IHttpRequestLifetimeFeature LifetimeFeature
70100
{
71-
get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); }
101+
get
102+
{
103+
return FeatureHelpers.GetOrCreateAndCache(
104+
this,
105+
_features,
106+
() => new HttpRequestLifetimeFeature(),
107+
ref _lifetime);
108+
}
72109
}
73110

74111
private ISessionFeature SessionFeature
75112
{
76-
get { return _session.Fetch(_features); }
113+
get { return FeatureHelpers.GetAndCache(this, _features, ref _session); }
114+
set
115+
{
116+
_features.Set(value);
117+
_session = value;
118+
}
77119
}
78120

79121
public override IFeatureCollection Features { get { return _features; } }
@@ -143,7 +185,7 @@ public override ISession Session
143185
if (feature == null)
144186
{
145187
feature = new DefaultSessionFeature();
146-
_session.Update(_features, feature);
188+
SessionFeature = feature;
147189
}
148190
feature.Session = value;
149191
}

src/Microsoft.AspNet.Http/DefaultHttpRequest.cs

+44-9
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,75 @@
1111

1212
namespace Microsoft.AspNet.Http.Internal
1313
{
14-
public class DefaultHttpRequest : HttpRequest
14+
public class DefaultHttpRequest : HttpRequest, IFeatureCache
1515
{
1616
private readonly DefaultHttpContext _context;
1717
private readonly IFeatureCollection _features;
18+
private int _cachedFeaturesRevision = -1;
1819

19-
private FeatureReference<IHttpRequestFeature> _request = FeatureReference<IHttpRequestFeature>.Default;
20-
private FeatureReference<IQueryFeature> _query = FeatureReference<IQueryFeature>.Default;
21-
private FeatureReference<IFormFeature> _form = FeatureReference<IFormFeature>.Default;
22-
private FeatureReference<IRequestCookiesFeature> _cookies = FeatureReference<IRequestCookiesFeature>.Default;
20+
private IHttpRequestFeature _request;
21+
private IQueryFeature _query;
22+
private IFormFeature _form;
23+
private IRequestCookiesFeature _cookies;
2324

2425
public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features)
2526
{
2627
_context = context;
2728
_features = features;
2829
}
2930

31+
void IFeatureCache.CheckFeaturesRevision()
32+
{
33+
if (_cachedFeaturesRevision != _features.Revision)
34+
{
35+
_request = null;
36+
_query = null;
37+
_form = null;
38+
_cookies = null;
39+
_cachedFeaturesRevision = _features.Revision;
40+
}
41+
}
42+
3043
private IHttpRequestFeature HttpRequestFeature
3144
{
32-
get { return _request.Fetch(_features); }
45+
get { return FeatureHelpers.GetAndCache(this, _features, ref _request); }
3346
}
3447

3548
private IQueryFeature QueryFeature
3649
{
37-
get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); }
50+
get
51+
{
52+
return FeatureHelpers.GetOrCreateAndCache(
53+
this,
54+
_features,
55+
(f) => new QueryFeature(f),
56+
ref _query);
57+
}
3858
}
3959

4060
private IFormFeature FormFeature
4161
{
42-
get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); }
62+
get
63+
{
64+
return FeatureHelpers.GetOrCreateAndCache(
65+
this,
66+
_features,
67+
this,
68+
(r) => new FormFeature(r),
69+
ref _form);
70+
}
4371
}
4472

4573
private IRequestCookiesFeature RequestCookiesFeature
4674
{
47-
get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); }
75+
get
76+
{
77+
return FeatureHelpers.GetOrCreateAndCache(
78+
this,
79+
_features,
80+
(f) => new RequestCookiesFeature(f),
81+
ref _cookies);
82+
}
4883
}
4984

5085
public override HttpContext HttpContext { get { return _context; } }

src/Microsoft.AspNet.Http/DefaultHttpResponse.cs

+24-5
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,46 @@
1010

1111
namespace Microsoft.AspNet.Http.Internal
1212
{
13-
public class DefaultHttpResponse : HttpResponse
13+
public class DefaultHttpResponse : HttpResponse, IFeatureCache
1414
{
1515
private readonly DefaultHttpContext _context;
1616
private readonly IFeatureCollection _features;
17-
private FeatureReference<IHttpResponseFeature> _response = FeatureReference<IHttpResponseFeature>.Default;
18-
private FeatureReference<IResponseCookiesFeature> _cookies = FeatureReference<IResponseCookiesFeature>.Default;
17+
private int _cachedFeaturesRevision = -1;
18+
19+
private IHttpResponseFeature _response;
20+
private IResponseCookiesFeature _cookies;
1921

2022
public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features)
2123
{
2224
_context = context;
2325
_features = features;
2426
}
2527

28+
void IFeatureCache.CheckFeaturesRevision()
29+
{
30+
if (_cachedFeaturesRevision != _features.Revision)
31+
{
32+
_response = null;
33+
_cookies = null;
34+
_cachedFeaturesRevision = _features.Revision;
35+
}
36+
}
37+
2638
private IHttpResponseFeature HttpResponseFeature
2739
{
28-
get { return _response.Fetch(_features); }
40+
get { return FeatureHelpers.GetAndCache(this, _features, ref _response); }
2941
}
3042

3143
private IResponseCookiesFeature ResponseCookiesFeature
3244
{
33-
get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); }
45+
get
46+
{
47+
return FeatureHelpers.GetOrCreateAndCache(
48+
this,
49+
_features,
50+
(f) => new ResponseCookiesFeature(f),
51+
ref _cookies);
52+
}
3453
}
3554

3655
public override HttpContext HttpContext { get { return _context; } }

0 commit comments

Comments
 (0)