مهارتهای تزریق وابستگیها در برنامههای NET Core. - قسمت سوم - رهاسازی منابع سرویسهای IDisposable
نویسنده: وحید نصیری
تاریخ: ۱۳۹۷/۱۰/۱۱ ۸:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace CoreIocServices
{
public interface IMyDisposableService
{
void Run();
}
public class MyDisposableService : IMyDisposableService, IDisposable
{
private readonly ILogger<MyDisposableService> _logger;
public MyDisposableService(ILogger<MyDisposableService> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_logger.LogInformation("+ {0} was created", this.GetType().Name);
}
public void Run()
{
_logger.LogInformation("Running MyDisposableService!");
}
public void Dispose()
{
_logger.LogInformation("- {0} was disposed!", this.GetType().Name);
}
}
} namespace CoreIocSample02
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyDisposableService, MyDisposableService>(); namespace CoreIocSample02.Controllers
{
public class HomeController : Controller
{
private readonly IMyDisposableService _myDisposableService;
public HomeController(IMyDisposableService myDisposableService)
{
_myDisposableService = myDisposableService;
}
public IActionResult Index()
{
_myDisposableService.Run();
return View();
} info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Route matched with {action = "Index", controller = "Home"}. Executing action CoreIocSample02.Controllers.HomeController.Index (CoreIocSample02)
info: CoreIocServices.MyDisposableService[0]
+ MyDisposableService was created
.
.
.
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'CoreIocSample02.Controllers.HomeController.Index (CoreIocSample02)'
info: CoreIocServices.MyDisposableService[0]
- MyDisposableService was disposed!
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 1316.4719ms 200 text/html; charset=utf-8 namespace CoreIocSample02
{
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
var writer = File.CreateText(Path.GetTempFileName());
context.Response.RegisterForDispose(writer);
context.Items["filewriter"] = writer;
await writer.WriteLineAsync("some important information");
await writer.FlushAsync();
await next();
}); namespace CoreIocSample02.Controllers
{
public class HomeController : Controller
{
public async Task<IActionResult> WriteLog()
{
var writer = HttpContext.Items["filewriter"] as StreamWriter;
if (writer != null)
{
await writer.WriteLineAsync("more important information");
await writer.FlushAsync();
}
return View();
} using(var scope = serviceProvider.CreateScope())
{
var provider = scope.ServiceProvider;
var resolvedService = provider.GetRequiredService(someType);
// Use resolvedService...
} public void Configure(IApplicationBuilder app,
ILoggerFactory loggerFactory,
IServiceScopeFactory scopeFactory)
{
using (var scope = scopeFactory.CreateScope())
{
var initializer = scope.ServiceProvider.GetService<IOperationScoped>();
initializer.SeedAsync().Wait();
}
} var myDisposableService = serviceProvider.GetService<IMyDisposableService>(); myDisposableService.Run();
var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); var serviceProvider = serviceCollection.BuildServiceProvider();
namespace Microsoft.Extensions.DependencyInjection
{
public sealed class ServiceProvider : IServiceProvider, IDisposable, IServiceProviderEngineCallback
{
public void Dispose();
public object GetService(Type serviceType);
}
} namespace CoreIocSample01
{
class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
using (var serviceProvider = serviceCollection.BuildServiceProvider())
{
var myDisposableService = serviceProvider.GetService<IMyDisposableService>();
myDisposableService.Run();
var testService = serviceProvider.GetService<ITestService>();
testService.Run();
}
}