Castle Windsor中的默认和后备实现

时间:2017-01-24 06:08:31

标签: .net castle-windsor castle

有没有办法在没有使用Windsor Castle的显式实现的情况下注册接口?我有几个接口需要在某些情况下实现,在其他情况下不需要它,例如我的应用程序的离线模式。在离线状态下,所有方法都应抛出不支持的异常;因此,相反为我的所有接口创建虚拟实现,在城堡中有一种方法可以提供默认的实现吗?。

2 个答案:

答案 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