Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }