{"id":1156,"date":"2022-01-12T22:47:42","date_gmt":"2022-01-12T19:47:42","guid":{"rendered":"http:\/\/delimuhendis.org\/?p=1156"},"modified":"2022-12-20T22:56:33","modified_gmt":"2022-12-20T22:56:33","slug":"net-core-ve-web-api-dependency-injection-autofac","status":"publish","type":"post","link":"https:\/\/www.delimuhendis.org\/?p=1156","title":{"rendered":"Net Core ve Web API: Dependency Injection (Autofac)"},"content":{"rendered":"\n<p>Merhaba arkada\u015flar, bug\u00fcn itibariyle \u00e7a\u011f\u0131m\u0131z\u0131n trendlerinden biri olan Microsoft&#8217;un sundu\u011fu en \u00f6nemli teknolojilerden biri olan Net Core ve Web API derslerine ba\u015flayaca\u011f\u0131z. Net Core son y\u0131llarda fazlaca Net Framework&#8217;\u00fcn yerini alm\u0131\u015f a\u00e7\u0131k kaynak kodlu ve bundan dolay\u0131 OS X, Linux ve Windows i\u015fletim sistemlerinde \u00e7al\u0131\u015fabilen yeni nesil Framework&#8217;t\u00fcr. Web API ise Http istekleri ve API geli\u015ftirmeleri olduk\u00e7a kolay bir hale getiren teknolojinin kendisidir. <\/p>\n\n\n\n<p>\u0130lk olarak dersimize Dependency Injection tasar\u0131m \u015fablonu, kullan\u0131m\u0131 ve avantajlar\u0131 ile ba\u015fl\u0131yoruz. Dependency Injection&#8217;\u0131n en \u00f6nemli sorumluluklar\u0131, s\u0131n\u0131flar\u0131n nesne ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 takip edip, onlara bu nesneleri sa\u011flamakt\u0131r.<\/p>\n\n\n\n<p>En yayg\u0131n Dependency Injection y\u00f6ntemi Constructor DI&#8217;d\u0131r. Yap\u0131c\u0131 method arac\u0131l\u0131\u011f\u0131 ile nesne ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 sa\u011flan\u0131r. Avantajlar\u0131ndan biri de tekrar eden kodlar\u0131n yerini almas\u0131d\u0131r. Peki Dependency Injection kullanman\u0131n hi\u00e7 mi dezavantaj\u0131 yok? Tabi ki var. Gereksiz DI kullan\u0131m\u0131 kompleksli\u011fi artt\u0131racak ve ayr\u0131ca DI \u00e7o\u011funlukla bir framework&#8217;e ihtiya\u00e7 duydu\u011fu i\u00e7in Framework ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na sebep olacakt\u0131r. B\u00fct\u00fcn bunlara kar\u015f\u0131n DI, kayna\u011f\u0131n efektif kullan\u0131m\u0131 ve kaliteli kod yaz\u0131m\u0131 a\u00e7\u0131s\u0131ndan \u00e7ok faydal\u0131d\u0131r. Net Core Framework, kendi i\u00e7inde DI yap\u0131s\u0131n\u0131 destekleyen Frameworklerdendir. <\/p>\n\n\n\n<p><strong>Dependency Injection Lifetime<\/strong><\/p>\n\n\n\n<p>Scope: Uygulamaya yap\u0131lan her istek i\u00e7in bir ba\u011f\u0131ml\u0131l\u0131k olu\u015fturulur. Bu ba\u011f\u0131ml\u0131l\u0131k, istek ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca devam eder.<\/p>\n\n\n\n<p>Singleton: Uygulama ilk aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131nda bir ba\u011f\u0131ml\u0131l\u0131k olu\u015fturulur ve memory&#8217;de tutulur. Her zaman bu ba\u011f\u0131ml\u0131l\u0131k kullan\u0131l\u0131r. Ba\u011f\u0131ml\u0131l\u0131k seviyesi en y\u00fcksek y\u00f6ntemdir.<\/p>\n\n\n\n<p>Transient: Ba\u011f\u0131ml\u0131l\u0131k servisi her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, o servisin ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 tekrardan olu\u015fturulur. En d\u00fc\u015f\u00fck seviyeli ba\u011f\u0131ml\u0131l\u0131k y\u00f6ntemidir.<\/p>\n\n\n\n<p>\u015eimdi Scope y\u00f6ntemini kullanarak .Net Core dahili Dependecy Injection yap\u0131s\u0131nda bir \u00f6rnek ger\u00e7ekle\u015ftirelim.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface ISampleService\n{\n    public double Sum(double Number1, double Number2);\n}    <\/code><\/pre>\n\n\n\n<p>Yukar\u0131daki gibi Servis aray\u00fcz\u00fcm\u00fcz\u00fc tan\u0131ml\u0131yoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class SampleService : ISampleService\n{\n    public double Sum(double Number1, double Number2)\n    {\n        return Number1 + Number2;\n    }\n}<\/code><\/pre>\n\n\n\n<p>Bu \u015fekilde aray\u00fcz\u00fcm\u00fcz\u00fc implemente eden servis s\u0131n\u0131f\u0131m\u0131z\u0131 ve methodumuzu yaz\u0131yoruz. \u015eimdi, Dependency Injection i\u00e7in servisimizi Startup i\u00e7inde kay\u0131t etmemiz gerekmektedir.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ This method gets called by the runtime. Use this method to add services to the container.\n   public void ConfigureServices(IServiceCollection services)\n   {\n       services.AddScoped&lt;ISampleService,SampleService&gt;();\n       services.AddControllersWithViews();\n   }<\/code><\/pre>\n\n\n\n<p>Yukar\u0131da scope yap\u0131s\u0131n\u0131 kullanarak servisimizi register ettik. Bu \u015fekilde her istek yap\u0131ld\u0131\u011f\u0131nda SampleService&#8217;in bir \u00f6rne\u011fi al\u0131nacak. Son olarak a\u015fa\u011f\u0131daki gibi Controller s\u0131n\u0131f\u0131m\u0131za servisimizin ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 tan\u0131ml\u0131yoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class HomeController : Controller\n{\n    private readonly ISampleService _sampleService;\n\n    public HomeController(ISampleService sampleService)\n    {\n        _sampleService = sampleService;\n    }\n\n    public IActionResult Index()\n    {\n        var total = _sampleService.Sum(2, 3);\n        return View(total);\n    }\n}<\/code><\/pre>\n\n\n\n<p>Bu \u015fekilde ilk DI \u00f6rne\u011fimizi ger\u00e7ekle\u015ftirmi\u015f olduk. Peki tek Dependency Injection yolu Net Core&#8217;un kendi DI mekanizmas\u0131 m\u0131? Hay\u0131r. Autofac son derece g\u00fcvenilir DI olana\u011f\u0131 sa\u011flamaktad\u0131r ve Autofac&#8217;in avantajlar\u0131ndan yaz\u0131m\u0131z\u0131n devam\u0131nda bahsedece\u011fim.<\/p>\n\n\n\n<p><strong>Autofac<\/strong><\/p>\n\n\n\n<p>\u015eimdi NuGet paketlerini y\u00fckleyerek i\u015fe ba\u015flayal\u0131m. \u0130lk olarak a\u015fa\u011f\u0131daki paketleri projemize ekliyoruz. <\/p>\n\n\n\n<p>Autofac (6.3.0)<\/p>\n\n\n\n<p>Autofac.Extras.DynamicProxy (6.0.0)<\/p>\n\n\n\n<p>Autofac.Extensions.DependencyInjection (7.2.0)<\/p>\n\n\n\n<p>\u015eimdi <em>AutofacModule<\/em> ad\u0131nda bir s\u0131n\u0131f olu\u015fturaca\u011f\u0131z. Bu s\u0131n\u0131f Dependency Register i\u015fleminin ger\u00e7ekle\u015ftirilece\u011fi s\u0131n\u0131f olacak.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class AutofacModule:Module\n{\n    protected override void Load(ContainerBuilder builder)\n    {\n        var assembly = System.Reflection.Assembly.GetExecutingAssembly();\n        builder.RegisterAssemblyTypes(assembly)\n            .Where(t =&gt; t.Name.EndsWith(\"Service\"))\n            .As(t =&gt; t.GetInterfaces()&#91;0]);\n    }\n}<\/code><\/pre>\n\n\n\n<p>Sonras\u0131nda bu s\u0131n\u0131f\u0131 Program.cs s\u0131n\u0131f\u0131m\u0131z i\u00e7erisinde Register etmemiz gerekmektedir. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.UseServiceProviderFactory(new AutofacServiceProviderFactory())\n    .ConfigureContainer&lt;ContainerBuilder&gt;(builder =&gt;\n    {\n        builder.RegisterModule(new AutofacModule());\n    });<\/code><\/pre>\n\n\n\n<p>Yukar\u0131daki kod host builder&#8217;\u0131m\u0131z\u0131n sonuna eklenmeli. Son durumda Program.cs s\u0131n\u0131f\u0131m\u0131z a\u015fa\u011f\u0131daki duruma geliyor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Program\n{\n    public static void Main(string&#91;] args)\n    {\n        CreateHostBuilder(args).Build().Run();\n    }\n\n    public static IHostBuilder CreateHostBuilder(string&#91;] args) =&gt;\n        Host.CreateDefaultBuilder(args)\n        .ConfigureWebHostDefaults(webBuilder =&gt;\n        {\n                webBuilder.UseStartup&lt;Startup&gt;();\n        })\n        .UseServiceProviderFactory(new AutofacServiceProviderFactory())\n        .ConfigureContainer&lt;ContainerBuilder&gt;(builder =&gt;\n        {\n                builder.RegisterModule(new AutofacModule());\n        });\n}<\/code><\/pre>\n\n\n\n<p>\u0130\u015fte bu kadar! Art\u0131k Startup s\u0131n\u0131f\u0131 i\u00e7erisinde herhangi bir register i\u015flemine gerek kalmad\u0131 ve Autofac DI yap\u0131s\u0131n\u0131 kullan\u0131yoruz. <\/p>\n\n\n\n<p>Dolay\u0131s\u0131yla daha \u00f6nce yazd\u0131\u011f\u0131m\u0131z ve Startup s\u0131n\u0131f\u0131 i\u00e7erisinde, ConfigureServices methodu i\u00e7erisinde yer alan <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services.AddScoped&lt;ISampleService,SampleService&gt;();<\/code><\/pre>\n\n\n\n<p>sat\u0131r\u0131n\u0131 kald\u0131rabiliriz. \u00c7\u00fcnk\u00fc yukar\u0131da <em>AutofacModule<\/em> s\u0131n\u0131f\u0131nda yazd\u0131\u011f\u0131m\u0131z kod sayesinde art\u0131k sonu Service ile biten t\u00fcm Servisler otomatik olarak register olacak ve ekstradan tekrar tekrar kod yazmam\u0131z gerekmeyecek.<\/p>\n\n\n\n<p>\u00d6zetle ilk olarak Microsoft Dependency Injection teknolojisini ve sonras\u0131nda Autofac k\u00fct\u00fcphanesini inceledik. Avantajlar\u0131, Dezavantajlar\u0131 ve kullan\u0131m\u0131n\u0131 \u00f6rnek kodlarla a\u00e7\u0131klamaya \u00e7al\u0131\u015ft\u0131k. Bir sonraki dersimizde g\u00f6r\u00fc\u015fmek \u00fczere. \u0130yi Kodlamalar!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, bug\u00fcn itibariyle \u00e7a\u011f\u0131m\u0131z\u0131n trendlerinden biri olan Microsoft&#8217;un sundu\u011fu en \u00f6nemli teknolojilerden biri olan Net Core ve Web API&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1366,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[46,64,150,151,154,285,349,414,608,609],"class_list":["post-1156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programlama","tag-api","tag-autofac","tag-dependency","tag-dependencyinjection","tag-dersleri","tag-injection","tag-kullanimi","tag-net-core","tag-web","tag-web-api"],"_links":{"self":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1156"}],"version-history":[{"count":2,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1156\/revisions"}],"predecessor-version":[{"id":1455,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1156\/revisions\/1455"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/media\/1366"}],"wp:attachment":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}