Guest User

Untitled

a guest
Jul 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.02 KB | None | 0 0
  1. namespace UnityWcfAssembler
  2. {
  3. public class UnityServiceHostFactory : ServiceHostFactory
  4. {
  5. protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
  6. {
  7. UnityServiceHost serviceHost = new UnityServiceHost(serviceType, baseAddresses);
  8. UnityContainer container = new UnityContainer();
  9. serviceHost.Container = container;
  10.  
  11. //TODO configuration from app.config
  12. //configure container
  13. //UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
  14. //section.Configure(serviceHost.Container);
  15.  
  16. InitializeSessionFactories(container);
  17.  
  18. return serviceHost;
  19. }
  20.  
  21. private static void InitializeSessionFactories(UnityContainer container)
  22. {
  23. Dictionary<String, ISessionFactory> sessions = new Dictionary<string, ISessionFactory>();
  24.  
  25. Configuration Cfg = new Configuration();
  26. Cfg.Configure();
  27. Cfg.SetProperty("connection.connection_string",
  28. "Data Source=(Local);Initial Catalog=Fossils;Integrated Security=true;");
  29. ISessionFactory Factory = Cfg.BuildSessionFactory();
  30. sessions.Add("fossils", Factory);
  31.  
  32. Cfg.SetProperty("connection.connection_string",
  33. "Data Source=(Local);Initial Catalog=TypeCollection;Integrated Security=true;");
  34. ISessionFactory typeFactory = Cfg.BuildSessionFactory();
  35.  
  36. sessions.Add("type", typeFactory);
  37.  
  38. Cfg.SetProperty("connection.connection_string",
  39. "Data Source=(Local);Initial Catalog=PersonalCollection;Integrated Security=true;");
  40. ISessionFactory persFactory = Cfg.BuildSessionFactory();
  41.  
  42. sessions.Add("personal", persFactory);
  43.  
  44. container.RegisterInstance(sessions);
  45. }
  46. }
  47. }
  48.  
  49. namespace UnityWcfAssembler
  50. {
  51. public class UnityServiceHost : ServiceHost
  52. {
  53. public UnityContainer Container { get; set; }
  54.  
  55. public UnityServiceHost()
  56. {
  57. Container = new UnityContainer();
  58. }
  59.  
  60. public UnityServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses)
  61. {
  62. Container = new UnityContainer();
  63. }
  64.  
  65. protected override void OnOpening()
  66. {
  67. new UnityServiceBehavior(Container).AddToHost(this);
  68.  
  69. base.OnOpening();
  70.  
  71. if (Description.Behaviors.Find<UnityServiceBehavior>() == null)
  72. Description.Behaviors.Add(new UnityServiceBehavior(Container));
  73. }
  74. }
  75. }
  76.  
  77. namespace UnityWcfAssembler
  78. {
  79. public class UnityInstanceProvider : IInstanceProvider
  80. {
  81. public UnityContainer Container { set; get; }
  82. public Type ServiceType { set; get; }
  83.  
  84. public UnityInstanceProvider() : this(null)
  85. {
  86. }
  87.  
  88. public UnityInstanceProvider(Type type)
  89. {
  90. ServiceType = type;
  91. Container = new UnityContainer();
  92. }
  93.  
  94. // Get Service instace via unity container
  95. public object GetInstance(InstanceContext instanceContext, Message message)
  96. {
  97. return Container.Resolve(ServiceType);
  98. }
  99.  
  100. public object GetInstance(InstanceContext instanceContext)
  101. {
  102. return GetInstance(instanceContext, null);
  103. }
  104.  
  105. public void ReleaseInstance(InstanceContext instanceContext, object instance)
  106. {
  107. }
  108. }
  109. }
  110.  
  111. namespace UnityWcfAssembler
  112. {
  113. public class UnityServiceBehavior : IServiceBehavior
  114. {
  115. public UnityInstanceProvider InstanceProvider { get; set; }
  116. private ServiceHost serviceHost;
  117.  
  118. public UnityServiceBehavior()
  119. {
  120. InstanceProvider = new UnityInstanceProvider();
  121. }
  122.  
  123. public UnityServiceBehavior(UnityContainer unity)
  124. {
  125. InstanceProvider = new UnityInstanceProvider();
  126. InstanceProvider.Container = unity;
  127. }
  128.  
  129. public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  130. {
  131. foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
  132. {
  133. ChannelDispatcher cd = cdb as ChannelDispatcher;
  134. if (cd != null)
  135. {
  136. foreach (EndpointDispatcher ed in cd.Endpoints)
  137. {
  138. InstanceProvider.ServiceType = serviceDescription.ServiceType;
  139. ed.DispatchRuntime.InstanceProvider = InstanceProvider;
  140. }
  141. }
  142. }
  143. }
  144.  
  145. public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
  146.  
  147. public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
  148.  
  149. public void AddToHost(ServiceHost host)
  150. {
  151. // only add to host once
  152. if (serviceHost != null) return;
  153. host.Description.Behaviors.Add(this);
  154. serviceHost = host;
  155. }
  156. }
  157. }
  158.  
  159. namespace FossilsWcfService
  160. {
  161. [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
  162. public class FossilsService : IFossilsService
  163. {
  164. private readonly Dictionary<string, ISessionFactory> sessionFactories;
  165.  
  166. public FossilsService(Dictionary<string, ISessionFactory> s)
  167. {
  168. sessionFactories = s;
  169. }
  170.  
  171. public SpeciesList GetAllSpecies()
  172. {
  173. SpeciesList list = new SpeciesList();
  174.  
  175. ISessionFactory factory = sessionFactories["fossils"];
  176.  
  177. if(factory == null)
  178. {
  179. list.Species.Add(new FossilSpecies { GenusName = "Session factory could not be resolved from container!" });
  180. return list;
  181. }
  182.  
  183. ISession session = factory.OpenSession();
  184.  
  185. SpeciesManager speciesManager = new SpeciesManager(session);
  186.  
  187. IList<FossilSpecies> species = speciesManager.GetAllSpecies();
  188.  
  189. foreach (FossilSpecies fossilSpecies in species)
  190. {
  191. list.Species.Add(fossilSpecies);
  192. }
  193. return list;
  194. }
  195.  
  196. <%@ ServiceHost Language="C#" Debug="true"
  197. Service="Server.Services.ExampleService"
  198. Factory="UnityWcfAssembler.UnityServiceHostFactory" %>
  199.  
  200. public class InvoiceService : IInvoiceService {
  201.  
  202. private IPayService payService;
  203.  
  204. public IPayService PayService
  205. {
  206. get { return payService; }
  207. set { payService= value; }
  208. }
  209.  
  210.  
  211. public InvoiceService(IPayService provider)
  212. {
  213. this.payService= provider;
  214. }
  215.  
  216. public bool Pay(){
  217. return PayService.Pay();
  218. }
  219.  
  220. }
  221.  
  222. public class InvoiceFactory : ServiceHostFactory
  223. {
  224. protected override ServiceHost CreateServiceHost(
  225. Type serviceType, Uri[] baseAddresses)
  226. {
  227. UnityServiceHost host = new UnityServiceHost(serviceType, baseAddresses);
  228. UnityContainer unity = new UnityContainer();
  229. host.Container = unity;
  230.  
  231. //I'm doing it like this because I put some AOP in the service injected
  232. var clazz = Intercept.ThroughProxy<IPayService>(new PayServiceConcreteClass(),
  233. new InterfaceInterceptor(), new[] { new LoggingInjection() });
  234.  
  235. unity.RegisterType<IPayService>().RegisterInstance(clazz);
  236.  
  237. return host;
  238. }
  239. }
  240.  
  241. //Better as an Interface
  242. IDictionary<String, ISessionFactory> sessions = new Dictionary<string, ISessionFactory>();
  243.  
  244.  
  245. //container.RegisterInstance(sessions);
  246. //Registering the type not the class
  247. container.RegisterType<IDictionary<String, ISessionFactory>>().RegisterInstance(sessions);
  248.  
  249. private readonly IDictionary<string, ISessionFactory> sessionFactories;
  250.  
  251. public FossilsService(IDictionary<string, ISessionFactory> s)
  252. {
  253. sessionFactories = s;
  254. }
  255.  
  256. <%@ ServiceHost Language="C#" Debug="true" Factory="InvoiceFactory" Service="InvoiceService" CodeBehind="InvoiceService.svc.cs" %>
Add Comment
Please, Sign In to add comment