مهارتهای تزریق وابستگیها در برنامههای NET Core. - قسمت پنجم - استفاده از الگوی Service Locator در مکانهای ویژهی برنامههای وب
نویسنده: وحید نصیری
تاریخ: ۱۳۹۷/۱۰/۱۳ ۱۲:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using Microsoft.Extensions.DependencyInjection;
namespace CoreIocSample02.Controllers
{
public class HomeController : Controller
{
public IActionResult Privacy()
{
var myDisposableService = this.HttpContext.RequestServices.GetRequiredService<IMyDisposableService>();
myDisposableService.Run();
return View();
}
}
} public class ApiExceptionFilter : ExceptionFilterAttribute
{
private ILogger<ApiExceptionFilter> _logger;
private IHostingEnvironment _environment;
private IConfiguration _configuration;
public ApiExceptionFilter(IHostingEnvironment environment, IConfiguration configuration, ILogger<ApiExceptionFilter> logger)
{
_environment = environment;
_configuration = configuration;
_logger = logger;
} using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace Filters
{
public class ApiExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ApiExceptionFilter>>();
logger.LogError(context.Exception, context.Exception.Message);
base.OnException(context);
}
}
} using Microsoft.Extensions.DependencyInjection;
using System.ComponentModel.DataAnnotations;
using CoreIocServices;
namespace Test
{
public class CustomValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = validationContext.GetRequiredService<IMyDisposableService>();
// use service
// ... validation logic
}
}
} namespace Test
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ITokenGenerator, TokenGenerator>();
} namespace Test
{
public class Program
{
public static void Main(string[] args)
{
IWebHost webHost = CreateWebHostBuilder(args).Build();
var tokenGenerator = webHost.Services.GetRequiredService<ITokenGenerator>();
string token = tokenGenerator.GetToken();
System.Console.WriteLine(token);
webHost.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
} namespace Microsoft.AspNetCore.Hosting
{
public interface IWebHost : IDisposable
{
IServiceProvider Services { get; }
}
} namespace CoreIocSample02
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
var scopeFactory = services.BuildServiceProvider().GetRequiredService<IServiceScopeFactory>();
using (var scope = scopeFactory.CreateScope())
{
var provider = scope.ServiceProvider;
using (var dbContext = provider.GetRequiredService<ApplicationDbContext>())
{
// ...
}
}
} public class Startup
{
public void ConfigureServices(IServiceCollection services) { }
public void Configure(IApplicationBuilder app, IAmACustomService customService)
{
// ....
}
} namespace CoreIocSample02
{
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
using (var scope = scopeFactory.CreateScope())
{
var provider = scope.ServiceProvider;
using (var dbContext = provider.GetRequiredService<ApplicationDbContext>())
{
//...
}
} private readonly Lazy<ITestService> _testService;
public TestController(Lazy<ITestService> testService)
{
this._testService= testService;
} public class MemberTest : IClassFixture<TestStartup>
{
private readonly TestStartup testStartup;
private readonly DatabaseSeedService seedService;
public MemberTest(TestStartup testStartup)
{
this.testStartup = testStartup;
this.seedService = this.testStartup.GetService<DatabaseSeedService>();
}
[Fact]
public async Task Add_InsertMember_ReturnOKResponse()
{
// ...
}
}