我使用了一個HadlerAttribute和一個ICallHandler的實例,從而實現了Unity攔截。爲了讓它工作,我所要做的就是用[Trace]屬性裝飾類,而攔截器的工作效果很好。使用自動佈線的統一攔截
[Trace]
public interface IPersonService
{
string GetPerson();
}
但是我想在兩個程序集中爲我的所有方法進行攔截工作。所以我使用Unity自動註冊成立我的容器如下: http://unity.codeplex.com/discussions/281022
我有一個UnityContainerExtension配置如下:除了當我試圖建立全球註冊按照這個帖子
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
//container.AddNewExtension<UnityInterfaceInterceptionRegisterer>();
container.
ConfigureAutoRegistration().
ExcludeSystemAssemblies().
LoadAssemblyFrom(typeof(PersonService).Assembly.Location).
Include(If.ImplementsITypeName, Then.Register()).
ApplyAutoRegistration();
return container;
}
偉大工程, ,其中MVC4Unity是我的DLL:
public class UnityInterfaceInterceptionRegisterer : UnityContainerExtension
{
protected override void Initialize()
{
base.Container.AddNewExtension<Interception>();
base.Container.Configure<Interception>().
AddPolicy("LoggingPolicy").
AddMatchingRule<AssemblyMatchingRule>
(new InjectionConstructor("MVC4Unity")).
AddCallHandler(new TraceCallHandler());
base.Context.Registering += new EventHandler<RegisterEventArgs>(this.OnRegister);
}
private void OnRegister(object sender, RegisterEventArgs e)
{
IUnityContainer container = sender as IUnityContainer;
if (e != null && e.TypeFrom != null && e.TypeFrom.IsInterface)
{
container.Configure<Interception>()
.SetInterceptorFor(e.TypeFrom, e.Name, new InterfaceInterceptor());
}
}
}
不幸的是它總是拋出一個StackOverflowException當它進入OnRegister方法(!)。
接下來的問題是,有沒有人使用Unity實現了程序集甚至命名空間廣泛的攔截,並且這是要走的路嗎?
[編輯]
看來,不管我在下面的AddMatchingRule行添加,該OnRegister處理程序被調用的所有包括的組件以及! (例如,甚至微軟的。*命名空間程序集!)
base.Container.AddNewExtension<Interception>();
base.Container.Configure<Interception>().
AddPolicy("LoggingPolicy").
// see what other types of matchings rules there are!
AddMatchingRule<NamespaceMatchingRule>
(new InjectionConstructor("MVC4Unity.*")).
AddCallHandler(new TraceCallHandler());
base.Context.Registering += new EventHandler<RegisterEventArgs>(this.OnRegister);