/// <summary> /// Initializes a new instance of the <see cref="SilkveilContainer" /> type. /// </summary> /// <param name="containerBinder">The container binder.</param> /// <param name="requestListeners">The request listeners.</param> /// <param name="downloadMappingResolver">The download mapping resolver.</param> /// <param name="redirectMappingResolver">The redirect mapping resolver.</param> /// <param name="downloadMappingProvider">The download mapping provider.</param> /// <param name="redirectMappingProvider">The redirect mapping provider.</param> /// <param name="contentSources">The content sources.</param> /// <param name="streamSplitter">The stream splitter.</param> /// <param name="httpStreamFactory">The HTTP stream factory.</param> public SilkveilContainer(IContainerBinder containerBinder, IEnumerable<IRequestListener> requestListeners, IMappingResolver<IDownloadMapping> downloadMappingResolver, IMappingResolver<IRedirectMapping> redirectMappingResolver, IMappingProvider<IDownloadMapping> downloadMappingProvider, IMappingProvider<IRedirectMapping> redirectMappingProvider, IEnumerable<IContentSource> contentSources, IStreamSplitter streamSplitter, IHttpStreamFactory httpStreamFactory) { Enforce.IsNotNull(containerBinder, () => containerBinder); Enforce.IsNotNullOrEmpty(requestListeners, () => requestListeners); Enforce.IsNotNull(downloadMappingResolver, () => downloadMappingResolver); Enforce.IsNotNull(redirectMappingResolver, () => redirectMappingResolver); Enforce.IsNotNull(downloadMappingProvider, () => downloadMappingProvider); Enforce.IsNotNull(redirectMappingProvider, () => redirectMappingProvider); Enforce.IsNotNullOrEmpty(contentSources, () => contentSources); Enforce.IsNotNull(streamSplitter, () => streamSplitter); Enforce.IsNotNull(httpStreamFactory, () => httpStreamFactory); this._requestListeners = requestListeners; this._downloadMappingResolver = downloadMappingResolver; this._redirectMappingResolver = redirectMappingResolver; this._downloadMappingProvider = downloadMappingProvider; this._redirectMappingProvider = redirectMappingProvider; this._contentSources = contentSources; this._streamSplitter = streamSplitter; this._httpStreamFactory = httpStreamFactory; containerBinder // Bind IIS request to all request listeners. .Bind(this, "HandleInternal", from r in this._requestListeners select (Action<string>)r.Handle) // Bind download request listener to download mapping resolver. .Bind<Guid>( from r in this._requestListeners where r.GetType() == typeof(DownloadRequestListener) select r, "ValidUriDetected", this._downloadMappingResolver.ResolveGuid) // Bind download request listener to download mapping resolver. .Bind<Guid>( from r in this._requestListeners where r.GetType() == typeof(RedirectRequestListener) select r, "ValidUriDetected", this._redirectMappingResolver.ResolveGuid) // Bind download mapping resolver to download mapping provider. .Bind<Guid>(this._downloadMappingResolver, "RequestMapping", this._downloadMappingProvider.ReadById) // Bind redirect mapping resolver to redirect mapping provider. .Bind<Guid>(this._redirectMappingResolver, "RequestMapping", this._redirectMappingProvider.ReadById) // Bind download mapping provider to download mapping resolver. .Bind<IDownloadMapping>(this._downloadMappingProvider, "MappingAvailable", this._downloadMappingResolver.RequestedMappingAvailable) // Bind redirect mapping provider to redirect mapping resolver. .Bind<IRedirectMapping>(this._redirectMappingProvider, "MappingAvailable", this._redirectMappingResolver.RequestedMappingAvailable) // Bind download mapping resolver to all content sources. .Bind<IDownloadMapping>(this._downloadMappingResolver, "MappingResolved", m => this._contentSources.ForEach(c => c.Request(m.Uri))) // Bind all content sources to stream splitter. .Bind<Stream>(this._contentSources, "ContentAvailable", this._streamSplitter.Split) // Bind stream splitter to IIS response. .Bind<IStreamPart>(this._streamSplitter, "StreamPartAvailable", this.OnResponsePartAvailable) // Bind redirect mapping resolver to the HTTP stream factory. .Bind<IRedirectMapping>(this._redirectMappingResolver, "MappingResolved", this._httpStreamFactory.CreateRedirect) // Bind HTTP stream factory to itself. .Bind(this._httpStreamFactory, "StreamAvailable", new Action<Stream>[] { this._httpStreamFactory.RequestStatusCode, this._httpStreamFactory.RequestHeaders }) // Bind HTTP stream factory to IIS response. .Bind<IDictionary<string, string>>(this._httpStreamFactory, "HeadersAvailable", this.OnHeadersAvailable) .Bind<int>(this._httpStreamFactory, "StatusCodeAvailable", this.OnStatusCodeAvailable); }
/// <summary> /// Initializes a new instance of the <see cref="SilkveilContainer" /> type. /// </summary> /// <param name="containerBinder">The container binder.</param> /// <param name="requestListeners">The request listeners.</param> /// <param name="downloadMappingResolver">The download mapping resolver.</param> /// <param name="redirectMappingResolver">The redirect mapping resolver.</param> /// <param name="downloadMappingProvider">The download mapping provider.</param> /// <param name="redirectMappingProvider">The redirect mapping provider.</param> /// <param name="contentSources">The content sources.</param> /// <param name="streamSplitter">The stream splitter.</param> /// <param name="httpStreamFactory">The HTTP stream factory.</param> public SilkveilContainer(IContainerBinder containerBinder, IEnumerable <IRequestListener> requestListeners, IMappingResolver <IDownloadMapping> downloadMappingResolver, IMappingResolver <IRedirectMapping> redirectMappingResolver, IMappingProvider <IDownloadMapping> downloadMappingProvider, IMappingProvider <IRedirectMapping> redirectMappingProvider, IEnumerable <IContentSource> contentSources, IStreamSplitter streamSplitter, IHttpStreamFactory httpStreamFactory) { Enforce.IsNotNull(containerBinder, () => containerBinder); Enforce.IsNotNullOrEmpty(requestListeners, () => requestListeners); Enforce.IsNotNull(downloadMappingResolver, () => downloadMappingResolver); Enforce.IsNotNull(redirectMappingResolver, () => redirectMappingResolver); Enforce.IsNotNull(downloadMappingProvider, () => downloadMappingProvider); Enforce.IsNotNull(redirectMappingProvider, () => redirectMappingProvider); Enforce.IsNotNullOrEmpty(contentSources, () => contentSources); Enforce.IsNotNull(streamSplitter, () => streamSplitter); Enforce.IsNotNull(httpStreamFactory, () => httpStreamFactory); this._requestListeners = requestListeners; this._downloadMappingResolver = downloadMappingResolver; this._redirectMappingResolver = redirectMappingResolver; this._downloadMappingProvider = downloadMappingProvider; this._redirectMappingProvider = redirectMappingProvider; this._contentSources = contentSources; this._streamSplitter = streamSplitter; this._httpStreamFactory = httpStreamFactory; containerBinder // Bind IIS request to all request listeners. .Bind(this, "HandleInternal", from r in this._requestListeners select(Action <string>) r.Handle) // Bind download request listener to download mapping resolver. .Bind <Guid>( from r in this._requestListeners where r.GetType() == typeof(DownloadRequestListener) select r, "ValidUriDetected", this._downloadMappingResolver.ResolveGuid) // Bind download request listener to download mapping resolver. .Bind <Guid>( from r in this._requestListeners where r.GetType() == typeof(RedirectRequestListener) select r, "ValidUriDetected", this._redirectMappingResolver.ResolveGuid) // Bind download mapping resolver to download mapping provider. .Bind <Guid>(this._downloadMappingResolver, "RequestMapping", this._downloadMappingProvider.ReadById) // Bind redirect mapping resolver to redirect mapping provider. .Bind <Guid>(this._redirectMappingResolver, "RequestMapping", this._redirectMappingProvider.ReadById) // Bind download mapping provider to download mapping resolver. .Bind <IDownloadMapping>(this._downloadMappingProvider, "MappingAvailable", this._downloadMappingResolver.RequestedMappingAvailable) // Bind redirect mapping provider to redirect mapping resolver. .Bind <IRedirectMapping>(this._redirectMappingProvider, "MappingAvailable", this._redirectMappingResolver.RequestedMappingAvailable) // Bind download mapping resolver to all content sources. .Bind <IDownloadMapping>(this._downloadMappingResolver, "MappingResolved", m => this._contentSources.ForEach(c => c.Request(m.Uri))) // Bind all content sources to stream splitter. .Bind <Stream>(this._contentSources, "ContentAvailable", this._streamSplitter.Split) // Bind stream splitter to IIS response. .Bind <IStreamPart>(this._streamSplitter, "StreamPartAvailable", this.OnResponsePartAvailable) // Bind redirect mapping resolver to the HTTP stream factory. .Bind <IRedirectMapping>(this._redirectMappingResolver, "MappingResolved", this._httpStreamFactory.CreateRedirect) // Bind HTTP stream factory to itself. .Bind(this._httpStreamFactory, "StreamAvailable", new Action <Stream>[] { this._httpStreamFactory.RequestStatusCode, this._httpStreamFactory.RequestHeaders }) // Bind HTTP stream factory to IIS response. .Bind <IDictionary <string, string> >(this._httpStreamFactory, "HeadersAvailable", this.OnHeadersAvailable) .Bind <int>(this._httpStreamFactory, "StatusCodeAvailable", this.OnStatusCodeAvailable); }