Есть ли способ зарегистрировать интерфейс без явной реализации с использованием Windsor Castle ?. У меня мало интерфейсов, которые нуждаются в реализации в некоторых случаях, но в других случаях это не нужно для автономного режима моего приложения. В автономном режиме все методы должны вызывать не поддерживаемое исключение; Вместо этого вместо этого создается фиктивная реализация для всех моих интерфейсов. Есть ли способ в замке, чтобы обеспечить реализацию по умолчанию, которая делает это?.Внештатная и резервная реализация в замке Windsor
ответ
Я не думаю, что то, что вы пытаетесь сделать, является правильным решением. И вот несколько способов, как добиться того же чуть лучше.
Первый подход
Что об использовании метода 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();
}
В настоящее время я использую типичную фабрику в нескольких местах, где я полагаюсь на замок, предоставляемый по умолчанию на заводе-изготовителе. Можно ли обрабатывать 1-й подход с использованием типичной фабрики? Я предполагаю, что для первого подхода я должен выполнить свою собственную реализацию фабрики. правильно? –
Немного поздно, но да. Вы должны определить свой собственный завод. – Maris
Я думаю, что вы ищете IHandlerSelector. Это позволяет вам условно выбрать компонент, который вы разрешаете. Итак, всегда есть явный компонент для решения, потому что, как еще он найдет компонент?
Ayende имеет статью давным-давно, объясняющий, как реализовать эту https://ayende.com/blog/3633/windsor-ihandlerselector
Вот более недавней статье http://www.longest.io/2015/03/13/select-between-components-castle-windsor.html
- 1. Внештатная реализация «нетрадиционных» полиморфизмов
- 2. Внештатная реализация коллекций
- 3. Внештатная реализация сетки .NET.NET
- 4. Внештатная резервная копия из капсулы timemachine
- 5. Внештатная реализация поставщика Powershell
- 6. ArrayResolver в замке Windsor ведет себя странно
- 7. Зарегистрировать несколько перехватчиков в замке Windsor свободно
- 8. Не удается зарегистрировать компонент в замке windsor
- 9. Внештатная реализация SDK для Facebook
- 10. Как свободно владеть контентом в замке Windsor IOC-контейнере
- 11. Внештатная реализация с использованием полной копии
- 12. Условное разрешение в замке Виндзор
- 13. 5.2 Внештатная настройка аутентификации
- 14. Ошибка замка Windsor в sitecore
- 15. Внештатная установка VSTO
- 16. Нити застрять в замке
- 17. В замке Windsor WCF Facility, как мне получить доступ к адресу конечной точки?
- 18. Как управлять услугами замка Windsor WCF?
- 19. Регистрация родовых декораторов в замке виндзора?
- 20. Переопределение регистрации компонентов в замке Виндзор? Какой контейнер поддерживает его?
- 21. Регистрация перехватчика для всех интерфейсов Реализация в Castle Windsor
- 22. Установщик NServiceBus и Windsor
- 23. пытается пошагово код в замке
- 24. Установку сеттера в существующем экземпляре службы в замке Виндзор
- 25. Замок Windsor с owin и Identity
- 26. пробуждение/ожидающая гонка в замке?
- 27. Разрешающие дженерик в Виндзорском замке
- 28. Резервная резервная база данных при инициализации
- 29. Где находится замок Windsor FromAssembly class?
- 30. Как настроить этот класс ClientBase в замке Виндзор
Простота ручной реализации, которая может быть сделано в течение нескольких секунд избивает сложность вашего желания автоматизации. –
Чтение вашего объяснения. Я получаю это ощущение, что что-то очень странно с вашим дизайном, и, возможно, вместо того, чтобы пытаться получить инструмент для магии, лучшим способом решить его было бы рассмотреть ваш подход, чтобы не требовать этого нечетного устройства. –
Да, это странно , Но слой над моим слоем (который у меня отсутствует) использует инсталляцию конструктора интерфейсов, которые я реализую для автономного режима (я считаю, что в автономном режиме никогда не было изображения в оригинальном дизайне), а некоторые из них не требуются в автономном режиме, но без реализации верхний слой даже не может быть создан. Мне поручено поднимать исключение, если вызываются какие-либо методы в этом не поддерживаемом интерфейсе. –