2017-01-24 6 views
1

Есть ли способ зарегистрировать интерфейс без явной реализации с использованием Windsor Castle ?. У меня мало интерфейсов, которые нуждаются в реализации в некоторых случаях, но в других случаях это не нужно для автономного режима моего приложения. В автономном режиме все методы должны вызывать не поддерживаемое исключение; Вместо этого вместо этого создается фиктивная реализация для всех моих интерфейсов. Есть ли способ в замке, чтобы обеспечить реализацию по умолчанию, которая делает это?.Внештатная и резервная реализация в замке Windsor

+1

Простота ручной реализации, которая может быть сделано в течение нескольких секунд избивает сложность вашего желания автоматизации. –

+1

Чтение вашего объяснения. Я получаю это ощущение, что что-то очень странно с вашим дизайном, и, возможно, вместо того, чтобы пытаться получить инструмент для магии, лучшим способом решить его было бы рассмотреть ваш подход, чтобы не требовать этого нечетного устройства. –

+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). И если текущий режим отключен, а тип, который вы пытаетесь разрешить, имеет атрибут [OnlyOnline], чем throw ApplicationOfflineException.

Второй подход

Вы можете использовать замок динамический прокси. Замок 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(); 
} 
+0

В настоящее время я использую типичную фабрику в нескольких местах, где я полагаюсь на замок, предоставляемый по умолчанию на заводе-изготовителе. Можно ли обрабатывать 1-й подход с использованием типичной фабрики? Я предполагаю, что для первого подхода я должен выполнить свою собственную реализацию фабрики. правильно? –

+0

Немного поздно, но да. Вы должны определить свой собственный завод. – Maris

0

Я думаю, что вы ищете IHandlerSelector. Это позволяет вам условно выбрать компонент, который вы разрешаете. Итак, всегда есть явный компонент для решения, потому что, как еще он найдет компонент?

Ayende имеет статью давным-давно, объясняющий, как реализовать эту https://ayende.com/blog/3633/windsor-ihandlerselector

Вот более недавней статье http://www.longest.io/2015/03/13/select-between-components-castle-windsor.html

Смежные вопросы