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

Remove FeatureReference indirection #420

Merged
merged 1 commit into from
Oct 15, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,44 @@

namespace Microsoft.AspNet.Http.Authentication.Internal
{
public class DefaultAuthenticationManager : AuthenticationManager
public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache
{
private readonly IFeatureCollection _features;
private FeatureReference<IHttpAuthenticationFeature> _authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
private FeatureReference<IHttpResponseFeature> _response = FeatureReference<IHttpResponseFeature>.Default;
private int _cachedFeaturesRevision = -1;

private IHttpAuthenticationFeature _authentication;
private IHttpResponseFeature _response;

public DefaultAuthenticationManager(IFeatureCollection features)
{
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_authentication = null;
_response = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpAuthenticationFeature HttpAuthenticationFeature
{
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpAuthenticationFeature(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this lamda bother you? Or are you relying on it getting optimized into a static field?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be a compile time const I believe? Was being careful not to create any closures which would then cause runtime per-call creation.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's worth verifying.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will be optimized. If we want to be more anal, we can declare static delegates.

ref _authentication);
}
}

private IHttpResponseFeature HttpResponseFeature
{
get { return _response.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _response); }
}

public override IEnumerable<AuthenticationDescription> GetAuthenticationSchemes()
Expand Down
35 changes: 30 additions & 5 deletions src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,51 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultConnectionInfo : ConnectionInfo
public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache
{
private readonly IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

private FeatureReference<IHttpConnectionFeature> _connection = FeatureReference<IHttpConnectionFeature>.Default;
private FeatureReference<ITlsConnectionFeature> _tlsConnection = FeatureReference<ITlsConnectionFeature>.Default;
private IHttpConnectionFeature _connection;
private ITlsConnectionFeature _tlsConnection;

public DefaultConnectionInfo(IFeatureCollection features)
{
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_connection = null;
_tlsConnection = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpConnectionFeature HttpConnectionFeature
{
get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpConnectionFeature(),
ref _connection);
}
}

private ITlsConnectionFeature TlsConnectionFeature
{
get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new TlsConnectionFeature(),
ref _tlsConnection);
}
}

public override IPAddress RemoteIpAddress
Expand Down
76 changes: 59 additions & 17 deletions src/Microsoft.AspNet.Http/DefaultHttpContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,22 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultHttpContext : HttpContext
public class DefaultHttpContext : HttpContext, IFeatureCache
{
private readonly HttpRequest _request;
private readonly HttpResponse _response;
private readonly ConnectionInfo _connection;
private readonly AuthenticationManager _authenticationManager;

private FeatureReference<IItemsFeature> _items;
private FeatureReference<IServiceProvidersFeature> _serviceProviders;
private FeatureReference<IHttpAuthenticationFeature> _authentication;
private FeatureReference<IHttpRequestLifetimeFeature> _lifetime;
private FeatureReference<ISessionFeature> _session;
private IItemsFeature _items;
private IServiceProvidersFeature _serviceProviders;
private IHttpAuthenticationFeature _authentication;
private IHttpRequestLifetimeFeature _lifetime;
private ISessionFeature _session;
private WebSocketManager _websockets;

private IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

public DefaultHttpContext()
: this(new FeatureCollection())
Expand All @@ -43,37 +45,77 @@ public DefaultHttpContext(IFeatureCollection features)
_response = new DefaultHttpResponse(this, features);
_connection = new DefaultConnectionInfo(features);
_authenticationManager = new DefaultAuthenticationManager(features);
}

_items = FeatureReference<IItemsFeature>.Default;
_serviceProviders = FeatureReference<IServiceProvidersFeature>.Default;
_authentication = FeatureReference<IHttpAuthenticationFeature>.Default;
_lifetime = FeatureReference<IHttpRequestLifetimeFeature>.Default;
_session = FeatureReference<ISessionFeature>.Default;
void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision !=_features.Revision)
{
_items = null;
_serviceProviders = null;
_authentication = null;
_lifetime = null;
_session = null;
_cachedFeaturesRevision = _features.Revision;
}
}

IItemsFeature ItemsFeature
{
get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new ItemsFeature(),
ref _items);
}
}

IServiceProvidersFeature ServiceProvidersFeature
{
get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new ServiceProvidersFeature(),
ref _serviceProviders);
}
}

private IHttpAuthenticationFeature HttpAuthenticationFeature
{
get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpAuthenticationFeature(),
ref _authentication);
}
}

private IHttpRequestLifetimeFeature LifetimeFeature
{
get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
() => new HttpRequestLifetimeFeature(),
ref _lifetime);
}
}

private ISessionFeature SessionFeature
{
get { return _session.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _session); }
set
{
_features.Set(value);
_session = value;
}
}

public override IFeatureCollection Features { get { return _features; } }
Expand Down Expand Up @@ -143,7 +185,7 @@ public override ISession Session
if (feature == null)
{
feature = new DefaultSessionFeature();
_session.Update(_features, feature);
SessionFeature = feature;
}
feature.Session = value;
}
Expand Down
53 changes: 44 additions & 9 deletions src/Microsoft.AspNet.Http/DefaultHttpRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,75 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultHttpRequest : HttpRequest
public class DefaultHttpRequest : HttpRequest, IFeatureCache
{
private readonly DefaultHttpContext _context;
private readonly IFeatureCollection _features;
private int _cachedFeaturesRevision = -1;

private FeatureReference<IHttpRequestFeature> _request = FeatureReference<IHttpRequestFeature>.Default;
private FeatureReference<IQueryFeature> _query = FeatureReference<IQueryFeature>.Default;
private FeatureReference<IFormFeature> _form = FeatureReference<IFormFeature>.Default;
private FeatureReference<IRequestCookiesFeature> _cookies = FeatureReference<IRequestCookiesFeature>.Default;
private IHttpRequestFeature _request;
private IQueryFeature _query;
private IFormFeature _form;
private IRequestCookiesFeature _cookies;

public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features)
{
_context = context;
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_request = null;
_query = null;
_form = null;
_cookies = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpRequestFeature HttpRequestFeature
{
get { return _request.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _request); }
}

private IQueryFeature QueryFeature
{
get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
(f) => new QueryFeature(f),
ref _query);
}
}

private IFormFeature FormFeature
{
get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
this,
(r) => new FormFeature(r),
ref _form);
}
}

private IRequestCookiesFeature RequestCookiesFeature
{
get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
(f) => new RequestCookiesFeature(f),
ref _cookies);
}
}

public override HttpContext HttpContext { get { return _context; } }
Expand Down
29 changes: 24 additions & 5 deletions src/Microsoft.AspNet.Http/DefaultHttpResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,46 @@

namespace Microsoft.AspNet.Http.Internal
{
public class DefaultHttpResponse : HttpResponse
public class DefaultHttpResponse : HttpResponse, IFeatureCache
{
private readonly DefaultHttpContext _context;
private readonly IFeatureCollection _features;
private FeatureReference<IHttpResponseFeature> _response = FeatureReference<IHttpResponseFeature>.Default;
private FeatureReference<IResponseCookiesFeature> _cookies = FeatureReference<IResponseCookiesFeature>.Default;
private int _cachedFeaturesRevision = -1;

private IHttpResponseFeature _response;
private IResponseCookiesFeature _cookies;

public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features)
{
_context = context;
_features = features;
}

void IFeatureCache.CheckFeaturesRevision()
{
if (_cachedFeaturesRevision != _features.Revision)
{
_response = null;
_cookies = null;
_cachedFeaturesRevision = _features.Revision;
}
}

private IHttpResponseFeature HttpResponseFeature
{
get { return _response.Fetch(_features); }
get { return FeatureHelpers.GetAndCache(this, _features, ref _response); }
}

private IResponseCookiesFeature ResponseCookiesFeature
{
get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); }
get
{
return FeatureHelpers.GetOrCreateAndCache(
this,
_features,
(f) => new ResponseCookiesFeature(f),
ref _cookies);
}
}

public override HttpContext HttpContext { get { return _context; } }
Expand Down
Loading