Middle+
Суроо иштетүүдүн алдын жана кийин ишке ашырууну middleware колдонбостон кантип жасоого болот?
sobes.tech AI
AIден жооп
Аспекттик-ориенттелген программалоо менен интерцепторлорду (interceptors) колдонуу, мисалы, Castle Windsor же AspectCore китепканалары аркылуу.
// Кызматтын интерфейси үчүн мисал
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Логгинг үчүн интерцептор
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Сураныч иштетилгенге чейин аракет
Console.WriteLine($"Методдун чакыруу башталды: {invocation.Method.Name}");
try
{
// Оригиналдуу методду иштетүү
invocation.Proceed();
// Ишти ийгиликтүү бүтүргөндөн кийин аракет
Console.WriteLine($"{invocation.Method.Name} методу ийгиликтүү аткарылды.");
}
catch (Exception ex)
{
// Ката чыкканда аракет
Console.WriteLine($"{invocation.Method.Name} методу чакырганда ката: {ex.Message}");
throw; // Ката кайра жиберилет
}
}
}
// Кызматты ишке ашыруу мисалы
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Параметр менен иштөө: {input}");
// Ката симуляциясы
// if (input == "ката") throw new InvalidOperationException("Кээ бир нерсе ката кетти");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Кызмат жана интерцепторду IoC контейнерине каттоо
public class Program
{
public static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(Component.For<LoggingInterceptor>());
container.Register(Component.For<IService>().ImplementedBy<MyService>().Interceptors<LoggingInterceptor>());
// Проксиленген кызмат үлгүсүн алуу
var service = container.Resolve<IService>();
service.DoSomething("тест");
// service.DoSomething("ката"); // Ката текшерүү үчүн
container.Dispose();
}
}
Ошондой эле:
- Декоратор (Decorator design pattern): Баштапкы класстын тегерегине каптоо түзүү, ал метод чакырууларын алдын ала жана кийин иштетет.
- Кодду тегиздөө (Code weaving): Байткодду компиляция же жүктөө учурунда өзгөртүү, мисалы, PostSharp сыяктуу инструменттерди колдонуу.