제어 및 의존성 주입의 .NET 핵심 ASP.NET 코어 기본 1-2 반전

.NET 핵심 ASP.NET 코어 기본 1-2

제어 및 종속 반전 주입이 절

간략한 소개

제어 IOC의 반전

C #을 우리의 고급 버전의 내용이 설명되어 있다는 사실은, 제어의 반전, 당신은 그가 휴대폰, 그는 휴대 전화를 사용하여 노래를 수행하는 A 브랜드를 가지고 사람을 고려, 제어의 반전을 이해할 수있는, 디자인 패턴입니다 게임을하는 것은, 당신은 휴대 전화와 인간 클래스를 만들 수 있습니다

class APhone : IPhone
{
    public string Owner{get;set;}
    public Phone(string own)
    {
        Owner = own;
    }
    void Play()
    {
        //省略
    }
    void Music()
    {
        //省略
    }
}
class Man
{
    public string Name{get;set;}
    void Game()
    {
        var p = new APhone(Name);
        p.Play();
    }
}

사실이 코드의 결합은 상대적으로 높은? 그것은 그 뭔가를 필요로 할 때, 나는이 일이 자신을 만들어, 앞으로 사용합니다. 왜이 잘못 그 후 단지 B 브랜드, 남자는 A-브랜드 휴대 전화를 사용하지 않기로 결정 어느 날, 그가 결정합니다. 그런 다음 전체 클래스 남자 사용 지역의하는 aphone 클래스는 변경 될 필요가 있다는 것을 의미한다. 이것은 매우 귀찮은 일이, 우리는 IOC가 반전 우리의 통제를 행사하기 위해 필요한이 시간입니다. 우리는 개체의 인스턴스를 만들거나 발신자의 사용은 자신의 사용에 대한 책임이 요구하는, 당신이 다른 사람에 의존하는이 과정의 이해를 주입 던졌다.

나는 그를 다시 사용할 필요가, 그렇지 않으면 나는 내 자신의 물건을 계속 사용하고, 지금은 내 상사로 제어 할 수 - 핵심은 제어의 반전이다. 이번에는 인터페이스의 역할은 자명, 전화 인터페이스 상속, B는 상속, 우리는 다른 인터페이스 A, B 객체가 AB 오브젝트를 전환하는 효과가 없습니다를 제작하는 전화로 시작 가정?

의존성 삽입 (Dependency Injection)

의존성 주입은이 IOC (Inversion of Control에)의 반영, 그것은, 그때 내가 하나를 만들 것, 객체를 원하는 포워드 이전 방식으로 사용이 매우 간단하고, 남자의 클래스 코드입니다. 이제 우리는 의존성 주입이되고있다 상위 수준의 인터페이스 객체의 우리의 통제이다 사용, 나는 개체를 원하는, 내가 상사가 나를 객체를 생성했다, 자신의 상사에 요청을 만들 것입니다. 우리는 일반적으로 의존성 주입 생성자 주입 방법을 사용합니다.

위의 코드는 될 것입니다

class Man
{
    private readonly IPhone _phone;
    public Man(IPhone phone)
    {
        _phone = phone;
    }
}

그런 다음 주입 휴대 전화 브랜드 B를 교체해야하는이 시간이 바로 객체 B 브랜드를 통과 할 수있는 장소가 필요하다고 가정하면.

용기

하지만 지금은 새로운 문제 클래스는 우리가 100 곳에서 그런 일을 할 수없는 경우, 인터페이스 의존하여 (100)를 가지며, 가정,있다? 컨트롤은, 반전 의존은 외부를 만들 넘겨. 문제는 지금, 우리는 모든 종속성을,이 시간, 우리는 중앙 집중식 관리를 위해 컨테이너를 사용하는 곳에서 통합 관리 시스템이 필요 너무 많은에 따라 달라집니다

컨테이너는 두 가지 책임이 있습니다 :

  • 그리고 서비스 인스턴스 사이의 결합 관계
  • 인스턴스 및 인스턴스 관리 (생성과 파괴를) 가져옵니다

용도

우리는 어떻게 .NET 코어에 대한 의존도가 너무 많이 주입 사용하는 것을? Microsoft.Extensions.DependencyInjection 네임 스페이스에서 IServiceCollection 및 IServiceProvider 위치 : 여기에 우리가 모든 .NET의 핵심 응용 프로그램을위한, .NET 핵심 코어의 의존성 주입의 두 가지 구성 요소로 나누어진다.

  • 등록 IServiceCollection 책임
  • 예를 제공 할 책임이 IServiceProvider

기본 컨테이너 ServiceCollection의 세 가지 방법이 있습니다

  • .AddTransient <I, C> ()
  • .AddSingleton <I, C> ()
  • .AddScoped <I, C> ()

여기에서 우리는 세 가지의 의존성 주입의 라이프 사이클을 언급 할 것

  • 싱글는 생성 될 전체 프로그램 동작 동안, 싱글 인, 언급
  • 과도마다의 getService 새로운 인스턴스를 생성된다는 것을 의미합니다
  • 스코프 범위는 단지 하나의 예를,으로 이해 될 수있는 동일한 의미 초기화에서 (오직 하나 개의 인스턴스를 생성하는 요청을 각 수준 같은 HTTP 요청은의 범위 내에있을 것)

우리는 우리가 용기에서 직접 우리의 개체 인스턴스를 얻을 의미 의존성 주입 원리를 시뮬레이션하기 위해 콘솔 프로젝트를 사용하려고 할 수 있습니다, 우리는 마크의 GUID의 고유성을 사용합니다.

//创建三个代表不同生命周期的接口
    interface IPhoneScope
    {
        Guid Guid { get; }
    }
    interface IPhoneSingleton
    {
        Guid Guid { get; }
    }
    interface IPhoneTransient
    {
        Guid Guid { get; }
    }
    //实现的类
    class PhoneService:IPhoneScope,IPhoneSingleton,IPhoneTransient
    {
        public PhoneService()
        {
            this._guid = Guid.NewGuid();
        }

        public PhoneService(Guid guid)
        {
            this._guid = guid;
        }

        private Guid _guid;

        public Guid Guid => this._guid;
    }

그런 다음, 우리의 주요 기능

namespace DI_AND_IOC
{
    class Program
    {
        static void Main(string[] args)
        {
            //注入服务
            var services = new ServiceCollection()
                .AddScoped<IPhoneScope, PhoneService>()
                .AddTransient<IPhoneTransient, PhoneService>()
                .AddSingleton<IPhoneSingleton, PhoneService>();
            //构造服务
            var provider = services.BuildServiceProvider();
            using (var scope = provider.CreateScope())
            {
                var p = scope.ServiceProvider;
                var scopeobj1 = p.GetService<IPhoneScope>();
                var transient1 = p.GetService<IPhoneTransient>();
                var singleton1 = p.GetService<IPhoneSingleton>();

                var scopeobj2 = p.GetService<IPhoneScope>();
                var transient2 = p.GetService<IPhoneTransient>();
                var singleton2 = p.GetService<IPhoneSingleton>();

                Console.WriteLine(
                    $"scope1: {scopeobj1.Guid},\n" +
                    $"transient1: {transient1.Guid}, \n" +
                    $"singleton1: {singleton1.Guid}\n");

                Console.WriteLine($"scope2: {scopeobj2.Guid}, \n" +
                                  $"transient2: {transient2.Guid},\n" +
                                  $"singleton2: {singleton2.Guid}\n");
            }
            //创建不同的scope
            using (var scope = provider.CreateScope())
            {
                var p = scope.ServiceProvider;
                var scopeobj3 = p.GetService<IPhoneScope>();
                var transient3 = p.GetService<IPhoneTransient>();
                var singleton3 = p.GetService<IPhoneSingleton>();
                Console.WriteLine($"scope3: {scopeobj3.Guid}, \n" +
                                  $"transient3: {transient3.Guid},\n" +
                                  $"singleton3: {singleton3.Guid}");
            }
        }
    }
}

다음과 같은 데이터가 같은 것을 얻어야한다

scope1: 096d38e5-0c7b-4e50-9c79-241fb18a56ed,
transient1: 289ebd11-8159-4f22-b53e-ed738a317313,
singleton1: b453b7f5-3594-4b66-99c8-a72763abaa83

scope2: 096d38e5-0c7b-4e50-9c79-241fb18a56ed,
transient2: 212ad420-e54c-4dd6-9214-abe91aacdd9c,
singleton2: b453b7f5-3594-4b66-99c8-a72763abaa83

scope3: 688b6ffd-a8c1-47f4-a20a-872c2285d67c,
transient3: 3d09997d-fffb-43d1-9e53-ccf9771c819d,
singleton3: b453b7f5-3594-4b66-99c8-a72763abaa83

찾을 수 있습니다, 변화의 모든 요구를 싱글 톤 오브젝트는 변경하지 않을 있으며, 그와 동등한 범위 객체는 새 범위를 만든 후 변경 및 과도 객체.

콘솔 서비스 프로젝트에 용기의 사용은 당신이에 소개 된 DLL을 가져올 수 있습니다 *** Microsoft.Extensions.DependencyInjection *** 어셈블리를 도입 할 필요가 없다는 점에 유의해야한다

일부 ASP.NET 핵심 프로젝트의 수명주기 관리 및 제어를 주입으로 일부 클래스 (서비스)이 가능하다 또는 다중 액션 컨트롤러에 걸쳐, 우리는 즉, 수명주기의 사용, 우리는 가능한 한 많은 메모리를 절약 할 수 있습니다 수정, 초기의 예는 소비를 저감 할 수있다.

은 ASP.NET 코어의 사용

ASP.NET 코어, 우리는 의존성 주입은 매우 간단 사용하는 우리가 용기를 구축하기 위해, 시작 프로그램 클래스의 ConfigureServices 방법은 잘되었습니다, 우리는이 같은 작업을 할 필요가

services.AddScoped<IPhoneScope, PhoneService>();
services.AddDbContext<DbContext>();
services.AddMVC();

당신이 컨트롤러에서 서비스를 주입해야하는 경우, 공식 추천은 생성자 주입을 사용하는 것입니다

public IPhoneScope _ips;
public Controller(IPhoneScope ips)
{
    _ips = ips;
}

당신이 주입 된 MVC 면도기 페이지를 사용하는 경우 특히, 다음 명령을 입력

@inject IPhoneScope  ips

내 게시물이 당신을 도움이 있다면, 당신 github.NETCoreGuide 프로젝트는 나에게 별, 정원 중간 블로그에 관심과 추천을 도왔다.

Github에서

비리 비리 홈

WarrenRyan'sBlog

블로그 공원

추천

출처www.cnblogs.com/WarrenRyan/p/11444398.html