Autofac/Base/Extensions.cs
1 //
2 // Copyright (c) Microsoft. All rights reserved.
3 // Licensed under the MIT license.
4 //
5 // Microsoft Bot Framework: http://botframework.com
6 //
7 // Bot Builder SDK GitHub:
8 // https://github.com/Microsoft/BotBuilder
9 //
10 // Copyright (c) Microsoft Corporation
11 // All rights reserved.
12 //
13 // MIT License:
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 //
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 //
25 // THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 //
33 
34 using Autofac;
35 using Autofac.Builder;
36 using System;
37 
38 namespace Microsoft.Bot.Builder.Autofac.Base
39 {
40  public static partial class Extensions
41  {
55  public static
56  IRegistrationBuilder<TImplementer, ConcreteReflectionActivatorData, SingleRegistrationStyle>
57  RegisterKeyedType<TImplementer, TLimit>(this ContainerBuilder builder)
58  {
59  // use Autofac to autowire the implementer of the service
60  // with a key of that implementer type so that it can be overridden
61  return
62  builder
63  .RegisterType<TImplementer>()
64  .Keyed<TLimit>(typeof(TImplementer));
65  }
66 
78  public static
79  IRegistrationBuilder<TLimit, SimpleActivatorData, SingleRegistrationStyle>
80  RegisterAdapterChain<TLimit>(this ContainerBuilder builder, params Type[] types)
81  {
82  return
83  builder
84  .Register(c =>
85  {
86  // http://stackoverflow.com/questions/23406641/how-to-mix-decorators-in-autofac
87  TLimit service = default(TLimit);
88  for (int index = 0; index < types.Length; ++index)
89  {
90  // resolve the keyed adapter, passing the previous service as the inner parameter
91  service = c.ResolveKeyed<TLimit>(types[index], TypedParameter.From(service));
92  }
93 
94  return service;
95  })
96  .As<TLimit>();
97  }
98  }
99 }