只有代码
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 using Microsoft.Practices.Unity;
8 using Microsoft.Practices.Unity.InterceptionExtension;
9
10 namespace AOPStudy
11 {
12 class Program
13 {
14 static void Main(string[] args)
15 {
16 var container = new UnityContainer()
17 .AddNewExtension<Interception>()
18 .RegisterType<ICacheManager, CacheManager>()
19 .RegisterType<IPermissionService, PermissionService>()
20 .RegisterType<IAuthenticationService, AuthenticationService>()
21 .RegisterType<IApplicationService, ApplicationService>();
22
23 container
24 .Configure<Interception>()
25 .SetInterceptorFor<IApplicationService>(new InterfaceInterceptor())
26 .SetInterceptorFor<IPermissionService>(new InterfaceInterceptor());
27
28 var applicationService = container.Resolve<IApplicationService>();
29
30 Console.WriteLine("************************");
31 applicationService.DoSometing();
32 Console.WriteLine("************************");
33 applicationService.DoSometing();
34 }
35 }
36
37 public interface IApplicationService
38 {
39 void DoSometing();
40 }
41
42 public class ApplicationService : IApplicationService
43 {
44 [Permission]
45 public void DoSometing()
46 {
47 //此处执行业务逻辑
48 }
49 }
50
51 public class PermissionHandler : ICallHandler
52 {
53 private IAuthenticationService _AuthenticationService;
54
55 public PermissionHandler(IAuthenticationService authenticationService)
56 {
57 _AuthenticationService = authenticationService;
58 }
59
60 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
61 {
62 var userId = new Guid("58E4E105-96E9-42BE-83E4-01B6010D04BB");//真实项目中从Session中获取
63 var permissionId = Guid.NewGuid();//真实项目中从自定义Attribute中获取
64
65 if (!_AuthenticationService.HasPermission(userId, permissionId))
66 {
67 Console.WriteLine("您没有权限");
68 //真实项目中需要抛出自定义异常
69 }
70 else
71 {
72 Console.WriteLine("您有权限");
73 }
74
75 return getNext()(input, getNext);
76 }
77
78 public int Order { get; set; }
79 }
80
81 public class PermissionAttribute : HandlerAttribute
82 {
83 public override ICallHandler CreateHandler(IUnityContainer container)
84 {
85 return container.Resolve<PermissionHandler>();
86 }
87 }
88
89 public class CacheHandler : ICallHandler
90 {
91 private ICacheManager _CacheManager;
92
93 public CacheHandler(ICacheManager cacheManager)
94 {
95 _CacheManager = cacheManager;
96 }
97
98 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
99 {
100 string key = input.Arguments[0].ToString();//真实项目设置自己的策略
101
102 if (!_CacheManager.Has(key))
103 {
104 _CacheManager.Add(key, getNext()(input, getNext));
105 Console.WriteLine("只会执行一次");
106 }
107
108 return _CacheManager.Get(key) as IMethodReturn;
109 }
110
111 public int Order { get; set; }
112 }
113
114 public class CacheAttribute : HandlerAttribute
115 {
116 public override ICallHandler CreateHandler(IUnityContainer container)
117 {
118 return container.Resolve<CacheHandler>();
119 }
120 }
121
122 public class Permission
123 {
124 public Guid PermissionId { get; set; }
125 }
126
127 public interface IPermissionService
128 {
129 IEnumerable<Permission> FindPermissionByUserId(Guid userId);
130 }
131
132 public class PermissionService : IPermissionService
133 {
134 [Cache]
135 public IEnumerable<Permission> FindPermissionByUserId(Guid userId)
136 {
137 return new List<Permission> { new Permission() { PermissionId = Guid.NewGuid() } };
138 }
139 }
140
141 public interface IAuthenticationService
142 {
143 bool HasPermission(Guid userId, Guid permissionId);
144 }
145
146 public class AuthenticationService : IAuthenticationService
147 {
148 private IPermissionService _PermissionService;
149
150 public AuthenticationService(IPermissionService permissionService)
151 {
152 _PermissionService = permissionService;
153 }
154
155 public bool HasPermission(Guid userId, Guid permissionId)
156 {
157 return _PermissionService.FindPermissionByUserId(userId).Any(x => x.PermissionId == permissionId);
158 }
159 }
160
161 public interface ICacheManager
162 {
163 void Add(string key, object value);
164
165 bool Has(string key);
166
167 object Get(string key);
168 }
169
170 public class CacheManager : ICacheManager
171 {
172 private static Dictionary<string, object> _Values = new Dictionary<string, object>();
173
174 public void Add(string key, object value)
175 {
176 _Values.Add(key, value);
177 }
178
179 public bool Has(string key)
180 {
181 return _Values.ContainsKey(key);
182 }
183
184 public object Get(string key)
185 {
186 return _Values[key];
187 }
188 }
189 }