Итак, у меня есть эта проблема, и никто, кажется, не сможет помочь. Так что вместо того, чтобы продолжать ссориться, я собираюсь выбросить это для альтернативных способов кожи этого конкретного кота.
В настоящее время у меня есть следующее:
public interface ICustomerService
{
Customer GetCustomer(int id);
}
public class CustomerService : ICustomerService
{
public Customer GetCustomer(int id)
{
...
}
}
... и с Unity у меня есть настройка IOC, и в то же время настройка перехвата, как:
IUnityContainer ioc = new UnityContainer();
ioc.RegisterType<ICustomerService, CustomerService>()
.Configure<Interception>()
.SetInterceptorFor<ICustomerService>(new InterfaceInterceptor());
То, чего я хочу достичь, - это возможность размещать атрибуты в интерфейсе следующим образом:
public interface ICustomerService
{
[Log]
Customer GetCustomer(int id);
}
... определяется как:
public class LogAttribute: HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogHandler();
}
}
... а затем в классе LogHandler сделать все записи, которые я хочу, как:
public class LogHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
... log stuff
}
}
То, чего я хочу добиться, - это система трассировки / ведения журналов, где обработчик регистрирует, как вызывается namespace.class.methodname, И родительский namespace.class.methodname, который вызвал это. Я безуспешно пытался использовать параметр «input» IMethodInvocation, чтобы получить информацию, которую я хочу, проблема заключается в том, что input возвращает интерфейс «ICustomerService», а проверка стекового фрейма для родителя возвращает реализованный класс родителя (например, . CustomerService) означает, что когда я пытаюсь создать древовидную структуру, используя namespace.class.methodname в качестве идентификаторов сущностей, идентификаторы и parentID не совпадают.
Вставка параметра в атрибут [Log] тоже не сработает, потому что я могу туда вставить? Если я добавлю имя интерфейса, у меня все еще будет та же проблема, что и выше, где идентификатор одного - это интерфейс, а родительский - реализующий класс. И я не могу поместить имя реализующего класса в атрибуте интерфейса, так как это в первую очередь противоречит цели иметь интерфейс!
Итак, это дилемма. У кого-нибудь есть свежие идеи?