我有Unity設置來攔截方法調用,當方法用特定屬性修飾時。我希望所有的Unity代理對象在每個線程中保持不變(而不是暫時的)。從AttributeHandler訪問UnityContainer
問題是裝飾屬性創建的對象每次都創建爲「新」。我看不到從屬性內部訪問UnityContainer的方法。如果可以的話,我會創建LogHandler作爲每線程實體並通過Unity請求它。 (這甚至有意義嗎?使用Unity來解析在統一攔截中使用的對象?)。
如果你運行這個代碼,記錄器輸出的計數總是'1'。要清楚的是,這個'LogHandler'就是我想要堅持的。
如何通過代碼中的其他位置解析對象?你是否在團結集裝箱周圍傳遞?是否有我可以用來從我的代碼中的任何地方請求它的模式?
using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
namespace UnityTest2
{
class Program
{
private static UnityContainer _uC;
static void Main(string[] args)
{
_uC = new UnityContainer();
_uC.AddNewExtension<Interception>();
_uC.Configure<Interception>().SetInterceptorFor<ICalc>(new InterfaceInterceptor());
_uC.RegisterType<ICalc, Calc>(new PerThreadLifetimeManager());
var c = _uC.Resolve<ICalc>();
Console.WriteLine(c.Add(3, 7));
Console.WriteLine(c.Sub(3, 7));
Console.ReadKey();
}
}
public class LogAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
// I want this to persist per thread
return new LogHandler();
}
}
public class LogHandler : ICallHandler
{
private int runCount = 0;
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
runCount++;
// this is always '1'
Console.WriteLine(runCount);
return getNext()(input, getNext);
}
public int Order { get; set; }
}
public interface ICalc
{
int Add(int x, int y);
int Sub(int x, int y);
int Mul(int x, int y);
}
public class Calc : ICalc
{
[Log]
public int Add(int x, int y)
{
return x + y;
}
[Log]
public int Sub(int x, int y)
{
return x - y;
}
public int Mul(int x, int y)
{
return x * y;
}
}
}
這就是我一直在尋找的,謝謝。我對反模式很熟悉,但並不知道我可以用它作爲解決方案。 – flacnut