有没有办法在没有使用Windsor Castle的显式实现的情况下注册接口?我有几个接口需要在某些情况下实现,在其他情况下不需要它,例如我的应用程序的离线模式。在离线状态下,所有方法都应抛出不支持的异常;因此,相反为我的所有接口创建虚拟实现,在城堡中有一种方法可以提供默认的实现吗?。
答案 0 :(得分:1)
我不认为你想要做的是一个正确的解决方案。以下是一些如何以更好的方式实现相同目的的方法。
第一种方法
使用Factory方法怎么样? :)您可以使用该工厂方法来解析接口的impl。例如:
T Create<T>(ModeEnum mode): where T:YourInterface{
if(mode==ModeEnum.Offline){
throw ApplicationOfflineException();
}
return instance; // Create somehow instance of a class
}
在这种情况下,不会在运行时构建新类型,而是在应用程序脱机时阻止解析该类型。
使用这种方法,您可以继续前进,例如,您可以标记具有某种属性的所有类/接口(例如,OnlyOnline)。如果当前模式为Offline,并且您尝试解析的类型具有属性[OnlyOnline]而不是抛出ApplicationOfflineException。
第二种方法
您可以使用Castle Dynamic代理。 Castle Dynamic Proxy提供AOP功能。这意味着您可以在运行使用IoC容器解析的任何类的每个方法之前执行某种逻辑。更多信息: https://github.com/castleproject/Core/blob/master/docs/dynamicproxy.md
以下是使用适用于您的控制台应用程序构建的CDP拦截器示例:
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(Component.For<PreventOfflineInterceptor>());
container.Register(
Classes.FromThisAssembly()
.BasedOn<IMyClass>()
.WithServiceAllInterfaces()
.Configure(c => c.Interceptors<PreventOfflineInterceptor>())
.LifestyleTransient()
);
container.Resolve<IMyClass>().MyMethod();
}
}
public class PreventOfflineInterceptor : IInterceptor
{
public bool IsOffline
{
get
{
// Get somehow information about mode, is it offline
return true;
}
}
public void Intercept(IInvocation invocation)
{
// If the app is not offline lets run the method otherwise throw an exception
if (IsOffline)
{
throw new NotImplementedException();
}
invocation.Proceed();
}
}
public class MyClass : IMyClass
{
public void MyMethod()
{
Console.WriteLine("MyMethod()");
}
}
public interface IMyClass
{
void MyMethod();
}
答案 1 :(得分:0)
我认为您正在寻找IHandlerSelector。这允许您有条件地选择您要解析的组件。所以总会有一个明确的组件要解决,因为它会如何找到组件?
Ayende很久以前的文章解释了如何实现这个https://ayende.com/blog/3633/windsor-ihandlerselector
这是最近的一篇文章http://www.longest.io/2015/03/13/select-between-components-castle-windsor.html