복합 응용 프로그램 라이브러리를 기반으로 응용 프로그램은 잠재적으로 많은 느슨하게 결합된 복합 모듈로 구성되어있습니다. They need to interact with the shell to contribute content and receive notifications based on user actions. 그들은 껍질과 상호 작용하는 내용을 기반으로 사용자의 동작에 기여하고 알림을받을 필요가있다. Because they are loosely coupled, they need a way to interact and communicate with one another to deliver the required business functionality. 왜냐하면 그들은 느슨하게 결합하는, 그들은 서로 상호 작용하고 필요한 비즈니스 기능을 제공하는 의사 소통 방법이 필요합니다.

To tie together these various modules, applications based on the Composite Application Library rely on a dependency injection container. 이러한 다양한 모듈을 함께 넥타이하려면, 응용 프로그램은 복합 애플 리케이션 라이브러리를 기반으로 의존성 주입 컨테이너에 의존하고있습니다. Dependency injection containers can reduce the dependency coupling between objects by providing the facility to instantiate instances of classes and manage their lifetime based on the configuration of the container. 의존성 주입 컨테이너 클래스의 인스턴스를 인스턴스하고 평생 관리하는 컨테이너의 구성에 따라 시설을 제공하여 개체 간의 종속성 커플링을 줄일 수있습니다. During the objects creation, the container injects any dependencies that the object has requested into it. 객체를 생성하는 동안 컨테이너 종속성을 해당 개체가 그것에 주사를 요청했습니다. If those dependencies have not yet been created, the container creates and injects them first. 이러한 종속성이 아직 만들어지지 않은 경우, 컨테이너를 생성하고 처음으로 그들을 주입했다. In some cases, the container itself is resolved as a dependency. 일부의 경우, 컨테이너 자체가 종속성으로 해결됩니다. For example, modules often get the container injected, so they can register their views and services with that container. 예를 들어, 자주 주입 컨테이너를 얻을, 모듈 그래서 그들은 자신의 견해와 서비스 컨테이너에 등록할 수있습니다.

There are several advantages of using a container: 거기에 컨테이너를 사용하는 몇 가지 장점이있습니다 :

  • A container removes the need for a component to have to locate its dependencies or manage their lifetimes. 컨테이너는 종속성을 찾을 수 또는 그들의 수명을 관리하는 구성 요소에 대한 필요성이 제거됩니다.
  • A container allows swapping the implementation of the dependencies without affecting the component. 한 컨테이너는 구성 요소에 영향을주지 않고 의존성의 구현 스와핑 수있습니다.
  • A container facilitates testability by allowing dependencies to be mocked. 한 컨테이너 의존성을 조롱 수 있도록함으로써 테스트 용이하게합니다.
  • A container increases maintainability by allowing new components to be easily added to the system. 컨테이너는 시스템에 새로운 구성 요소를 쉽게 추가할 수 있도록하여 유지력을 증가시킵니다.

 

 

응용 프로그램의 컨텍스트에서 복합 응용 프로그램을 도서관에, 거기에 컨테이너로 구체적인 이점도있습니다 : 기초

  • A container injects module dependencies into the module when it is loaded. 한 컨테이너는 모듈이 로드될 때 모듈에 종속성을 주입합니다.
  • A container is used for registering and resolving presenters and views. 컨테이너 등록 및 발표자 및 플레이를 해결하는 데 사용됩니다.
  • A container creates presenters and presentation models and injects the view. 컨테이너 발표자와 프레 젠 테이션 모델을 생성하고보기를 주입했다.
  • A container injects the composition services, such as the region manager and the event aggregator. 컨테이너 지역 매니저와 이벤트 어그리게이터를 조성 등 서비스, 주사.
  • A container is used for registering module-specific services, which are services that have module-specific functionality. 컨테이너는 특정 기능이 서비스 모듈 - - 특정 서비스, 모듈을 등록하는 데 사용됩니다.

 

 

다음 코드를 주입하는 방법을 작동을 보여줍니다. When the PositionModule 언제 PositionModule is created by the container, it is injected with the regionManager and the container. 컨테이너에 의해 생성되고, 그것은 regionManager와 컨테이너와 주입니다. In the RegisterViewsAndServices method, which is called from the module's Initialize method, when the module is loaded, various services, views, and presenters are registered. 어떤 모듈이 로드될모듈의 초기화 방법, 다양한 서비스, 플레이에서 호출하는 방법을 RegisterViewsAndServices, 발표자 및 등록되어있습니다.

public PositionModule(IUnityContainer container, IRegionManager regionManager)
{
    _container = container;
    _regionManagerService = regionManager;
}

public void Initialize()
{
    RegisterViewsAndServices();
    ...
}

protected void RegisterViewsAndServices()
{
    _container.RegisterType<IAccountPositionService, AccountPositionService>(new ContainerControlledLifetimeManager());
    _container.RegisterType<IPositionSummaryView, PositionSummaryView>();
    _container.RegisterType<IPositionSummaryPresentationModel, PositionSummaryPresentationModel>();
    ...
}

 

컨테이너를 사용하여

Containers are used for two primary purposes, namely registering and resolving. 컨테이너 두 가지 기본적인 목적, 즉 해결하기위한 등록 및 사용되고있다.

Registering 등록

Before you can inject dependencies into an object, the types of the dependencies need to be registered with the container. 전에 종속성을 주입할 수있는 개체로, 의존성의 유형은 컨테이너에 등록해야합니다. Registering a type involves passing the container an interface and a concrete type that implements that interface. 등록 유형 컨테이너 수있는 인터페이스와 그 인터페이스를 구현하는 구체적인 유형을 통과한다. There are primarily two means for registering types and objects: through code or through configuration. 그 종류와 개체를 등록은 주로 두 가지 의미 : 코드를 통해 또는 구성됩니다. The specific means vary from container to container. 특정 의미 컨테이너를 컨테이너에 이르기까지 다양합니다.

Typically, there are two ways of registering types and objects in the container through code: 일반적으로, 거기에 코드를 통해 컨테이너의 종류와 개체 등록의 두 가지 방법이있습니다 :

  • You can register a type or a mapping with the container. 당신은 형식이나 컨테이너와 매핑을 등록할 수있습니다. At the appropriate time, the container will build an instance of the type you specify. 적절한시기에, 컨테이너를 지정하는 유형의 인스턴스를 구축할 예정이다.
  • You can register an existing object in the container. 당신이 컨테이너에있는 기존 개체를 등록할 수있습니다. The container will return a reference to the existing object. 이 컨테이너는 기존의 개체에 대한 참조를 반환합니다.

 

 

C # EmployeeModule.cs

this.container.RegisterType <IEmployeesController, EmployeesController> (); 

앞의 코드 예제에서, 당신은 어떻게 EmployeesController the IEmployeesController 인터페이스는 첫 전술된 접근법을 사용해서 등록되는 것을 볼 수있습니다. For an example of entering configuration information through the Unity container, see Entering Configuration Information . the 통합 컨테이너를 통해 구성 정보를 입력하는 예를 들어, 입력 구성 정보를 참조하십시오.

Types registered with the container have a lifetime. 종류의 컨테이너로 등록 일생. This can be either singleton (a single instance for the container, so each time you resolve you get the same instance) or instance (each time you resolve you get a new instance). 이 중 하나씩 컨테이너 (단일 인스턴스를, 그래서 당신이) 동일한 인스턴스를 얻을 또는 예를 들어 당신이 새 인스턴스를 얻을 해결 (각 시간)를 해결 할 때마다 수있습니다. The lifetime can be specified at registration or through configuration. 수명을 등록 또는 구성을 통해 지정할 수있습니다. The default lifetime depends on the container implementation. 기본값은 평생 컨테이너 구현에 따라 달라집니다. For example, the Unity container registers services as instances by default. 예를 들어, 기본적으로 인스턴스로 통합 컨테이너에 등록 서비스를 제공합니다.

 

다음 코드 예제는 어디 EmployeesPresenter 컨테이너에 의해 해결되고있다 보여줍니다.

C# EmployeeModule.cs

EmployeesPresenter 발표자 = this.container.Resolve <EmployeesPresenter> (); 

 

The Employee s Presenter constructor contains the following dependencies, which are injected when it is resolved.

public EmployeesPresenter(IEmployeesView view, IEmployeesListPresenter listPresenter, IEmployeesController employeeController)
    {
        this.View = view;
        this.listPresenter = listPresenter;
        this.listPresenter.EmployeeSelected += new EventHandler<DataEventArgs<BusinessEntities.Employee>>(this.OnEmployeeSelected);
        this.employeeController = employeeController;
        View.SetHeader(listPresenter.View);
    }

컨테이너를 사용하기위한 고려 사항

You should consider the following before using containers: 당신이 컨테이너를 사용하기 전에 다음 사항을 고려해야합니다 :

  • Consider whether it is appropriate to register and resolve components using the container: 등록 여부를 적절하고 해결 구성 요소는 컨테이너 사용을 고려 :
    • Consider whether the performance impact of registering in the container and resolving instances from it is acceptable in your scenario. 컨테이너에 등록 여부와 그것의 인스턴스를 해결의 성능에 미치는 영향을 고려하여 시나리오에서 사용할 수있습니다. For example, if you need to create 10,000 polygons to draw a surface within the local scope of a rendering method, the cost of resolving all of those polygon instances through the container might have a significant performance cost because of the container's use of reflection for creating each entity. 예를 들어, 만약 당신이 렌더링 방식의 지역 범위 내에서 표면 무승부로 10,000 다각형을 만들, 컨테이너를 통해 모든 이들 다각형 인스턴스의 해결의 비용 컨테이너의 성능 때문에 상당한 비용을 만들기위한 반성의 사용을 가지고있을 필요 각 엔티티.
    • If there are many or deep dependencies, the cost of creation can increase significantly. 많은 경우에는 또는 깊은 의존성, 창조의 비용을 크게 증가시킬 수있다.
    • If the component does not have any dependencies or is not a dependency for other types, it may not make sense to put it in the container. 어떤 의존성이없는 경우 또는 다른 유형의 구성 요소에 대한 종속성이없는 경우, 그것은 용기에 넣어 이해가되지 않을 수있습니다.
  • Consider whether a component's lifetime should be registered as a singleton or instance: 평생 a 싱글톤 여부 또는 구성 요소의 인스턴스로 등록해야한다 고려 :
    • If the component is a global service that acts as a resource manager for a single resource, such as a logging service, you may want to register it as a singleton. 하는 경우 구성 요소는 로깅 서비스와 같은 하나의 리소스에 대한 리소스 매니저의 역할을, 당신은 싱글톤으로 등록을 원하는 수있는 글로벌 서비스입니다.
    • If the component provides shared state to multiple consumers, you may want to register it as a singleton. 상태를 공유하는 경우에는 구성 요소가 여러 소비자에게 제공하고, 당신은 싱글톤으로 등록을 할 수있습니다.
    • If the object that is being injected needs to have a new instance of it injected each time a dependent object needs one, register it as a non-singleton. 만약 객체가 그것의 새 인스턴스가 필요 주입되고 각 시간 종속 개체, 하나의 요구가 아닌 - 싱글톤으로 등록을 주입했다. For example, each Presentation Model needs a new instance of a view. 예를 들어, 각 프레 젠 테이션 모델 뷰의 새 인스턴스가 필요합니다.
  • Consider whether you want to configure the container through code or configuration: 여부를 구성 컨테이너에 코드 또는 구성을 통해 원하는 고려 :
    • If you want to centrally manage all the different services, configure the container through configuration. 만일 중앙에서 구성을 통해 컨테이너를 구성하는 다른 모든 서비스를 관리하고자합니다.
    • If you want to conditionally register specific services, configure the container through code. 만약 당신이 조건부 코드를 통해 특정 서비스를 구성 컨테이너 등록 싶어요.
    • If you have module-level services, consider configuring the container through code so that those services are only registered if the module is loaded. 모듈 - 수준의 서비스를 받아야하는 경우, 코드를 통해 모듈이로드되는 경우에만 해당 서비스에 등록하고있는 컨테이너를 구성한다.

+ Recent posts