Как правильно применить сквозную проблему для класса, созданного AbstractFactory?
У меня есть мой контейнер IOC, сконфигурированный для добавления проблемы с перекрестным отключением, но эти проблемы не добавляются к классам, созданным AbstractFactories.
public static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container = Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container);
container.RegisterType<IApplication, MyApplication>();
container.RegisterType<IUserStoreFactory, MyUserStoreFactory>();
container.RegisterType<IUserStore, MyUserStore>();
var app = container.Resolve<IApplication>();
app.Run();
}
public interface IApplication
{
void Run();
}
public class MyApplication : IApplication
{
private readonly IUserStoreFactory userStoreFactory;
public MyApplication(IUserStoreFactory userStoreFactory)
{
Debug.Assert(null != userStoreFactory, "UserFactory is required to construct user store.");
this.userStoreFactory = userStoreFactory;
}
public void Run()
{
Console.Write("Enter user id: ");
var userId = Console.ReadLine();
var userStore = this.userStoreFactory.Create(userId);
Console.Write("Enter user name: ");
var userName = Console.ReadLine();
userStore.Put("name", new { Name = userName });
var obj = userStore.Get("name");
Console.WriteLine(obj);
}
}
public interface IUserStoreFactory
{
IUserStore Create(string userId);
}
public class MyUserStoreFactory : IUserStoreFactory
{
public IUserStore Create(string userId)
{
return new MyUserStore(userId);
}
}
public interface IUserStore
{
void Put(string key, object obj);
object Get(string key);
}
public class MyUserStore : IUserStore
{
private readonly string userId;
public MyUserStore(string userId)
{
this.userId = userId;
}
public void Put(string key, object obj)
{
// Hard coding this dependency for the sake of simplicity.
GlobalStore.Put(this.userId + key, obj);
}
public object Get(string key)
{
// Hard coding this dependency for the sake of simplicity.
return GlobalStore.Get(this.userId + key);
}
}
public static class GlobalStore
{
private static readonly Dictionary<string, object> store = new Dictionary<string, object>();
public static void Put(string key, object obj)
{
store[key] = obj;
}
public static object Get(string key)
{
return store[key];
}
}
public class LoggingInterceptionBehavior : IInterceptionBehavior
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine("Before method execution : {0} | {1}", input.Target, input.MethodBase);
IMethodReturn msg = getNext()(input, getNext);
Console.WriteLine("After method execution : {0} | {1}", input.Target, input.MethodBase);
return msg;
}
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
public bool WillExecute
{
get
{
return true;
}
}
}
Перехватчики определяются в файле конфигурации следующим образом:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IApplication" type="AbstractFactoryInterceptionTest.IApplication, AbstractFactoryInterceptionTest"/>
<alias alias="IUserStore" type="AbstractFactoryInterceptionTest.IUserStore, AbstractFactoryInterceptionTest"/>
<alias alias="MyUserStore" type="AbstractFactoryInterceptionTest.MyUserStore, AbstractFactoryInterceptionTest"/>
<alias alias="LoggingInterceptionBehavior" type="AbstractFactoryInterceptionTest.LoggingInterceptionBehavior, AbstractFactoryInterceptionTest" />
<sectionExtension
type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,
Microsoft.Practices.Unity.Interception.Configuration" />
<container>
<extension type="Interception"/>
<register type="IApplication">
<interceptor type="InterfaceInterceptor" />
<interceptionBehavior type="LoggingInterceptionBehavior"/>
</register>
<register type="IUserStore">
<interceptor type="InterfaceInterceptor" />
<interceptionBehavior type="LoggingInterceptionBehavior"/>
</register>
</container>
LoggingInterceptor определен как для IApplication, так и для IUserStore. Но если вы запустите код, вы увидите, что IUserStore не перехватывается (поскольку его не разрешается через Unity).
Здесь выведено описание программы:
Before method execution : AbstractFactoryInterceptionTest.MyApplication | Void Run()
Enter user id: 123
Enter user name: Arnab
{ Name = Arnab }
After method execution : AbstractFactoryInterceptionTest.MyApplication | Void Run()
Как я могу изменить этот код, чтобы перехватчики также были применены к объектам, построенным с помощью factory?