TransactionFlowAttribute.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System.Collections.Generic;
  7. using System.ServiceModel.Dispatcher;
  8. using System.ServiceModel.Description;
  9. using System.Reflection;
  10. using System.Runtime.Serialization;
  11. using System.ServiceModel.Channels;
  12. [AttributeUsage(ServiceModelAttributeTargets.OperationBehavior)]
  13. public sealed class TransactionFlowAttribute : Attribute, IOperationBehavior
  14. {
  15. TransactionFlowOption transactions;
  16. public TransactionFlowAttribute(TransactionFlowOption transactions)
  17. {
  18. TransactionFlowBindingElement.ValidateOption(transactions);
  19. this.transactions = transactions;
  20. }
  21. public TransactionFlowOption Transactions
  22. {
  23. get
  24. {
  25. return this.transactions;
  26. }
  27. }
  28. internal static void OverrideFlow(BindingParameterCollection parameters, string action,
  29. MessageDirection direction, TransactionFlowOption option)
  30. {
  31. Dictionary<DirectionalAction, TransactionFlowOption> dictionary = EnsureDictionary(parameters);
  32. DirectionalAction da = new DirectionalAction(direction, action);
  33. if (dictionary.ContainsKey(da))
  34. {
  35. dictionary[da] = option;
  36. }
  37. else
  38. {
  39. dictionary.Add(da, option);
  40. }
  41. }
  42. static Dictionary<DirectionalAction, TransactionFlowOption> EnsureDictionary(BindingParameterCollection parameters)
  43. {
  44. Dictionary<DirectionalAction, TransactionFlowOption> dictionary =
  45. parameters.Find<Dictionary<DirectionalAction, TransactionFlowOption>>();
  46. if (dictionary == null)
  47. {
  48. dictionary = new Dictionary<DirectionalAction, TransactionFlowOption>();
  49. parameters.Add(dictionary);
  50. }
  51. return dictionary;
  52. }
  53. void ApplyBehavior(OperationDescription description, BindingParameterCollection parameters)
  54. {
  55. Dictionary<DirectionalAction, TransactionFlowOption> dictionary = EnsureDictionary(parameters);
  56. dictionary[new DirectionalAction(description.Messages[0].Direction, description.Messages[0].Action)] = this.transactions;
  57. }
  58. void IOperationBehavior.Validate(OperationDescription description)
  59. {
  60. }
  61. void IOperationBehavior.ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
  62. {
  63. }
  64. void IOperationBehavior.AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
  65. {
  66. if (parameters == null)
  67. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("parameters");
  68. ApplyBehavior(description, parameters);
  69. }
  70. void IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
  71. {
  72. }
  73. }
  74. }