2009-11-10 2 views
0

내가 StructureMap 상당히 새로운 오전, 그러나 나의 이해는 ObjectFactory에서 인스턴스를 얻는 두 가지 방법이 있다는 것입니다 : 유형별StructureMap을 사용하여 컨트롤러에 동일한 인터페이스의 다른 구현을 주입하는 가장 좋은 방법은 무엇입니까?

  1. (예 : ObjectFactory.GetInstance<IFoo>()) 종류와 이름 (예 : ObjectFactory.GetNamedInstance<IFoo>("foo.bar"))으로

StructMap을 사용하여 컨트롤러 인스턴스를 제공하는 MVC 컨트롤러 팩토리를 만드는 방법을 보여주는 많은 예제를 보았습니다. 그리고 대부분의 경우, 위의 옵션 # 1의 메서드를 사용하고 있습니다.

인터페이스 클래스는 나에게에 해당 인터페이스의 구현을 "주입"할 수있는 기능을 제공하여 ...

public class FooController : Controller 
{ 
    public FooController (IFooRepository fooRepository) 
    { 
    // constructor code goes here 
    } 
} 

의 우리가 생성자의 인자와 같은 저장소/DAO 인터페이스를 받아 어떤 컨트롤러가 있다고 가정 해 봅시다 내 컨트롤러. 두 개의 서로 다른 동작을 수행하려면 서로 다른 구현을 삽입하고 싶습니다. 아마도 하나의 경우 SQL Server 데이터베이스를 쿼리하는 리포지토리 구현이 필요하고 다른 경우 XML 파일 또는 웹 서비스 호출을 통해 데이터를 가져올 구현이 필요합니다.

ObjectFactory.GetInstance() 메소드를 사용하는 경우 컨트롤러에 리포지토리 인터페이스의 단일 구현 만 제공하는 것으로 제한됩니다.

그러나 명명 된 인스턴스를 사용하면 MVC 프레임 워크에서 제공하는 컨트롤러 이름을 기반으로 인스턴스를 만들어야합니다. 대부분의 경우이 URL은 일반적으로 URL에서 오는 컨트롤러 이름이지만 경로 구성에 달려 있습니다. 이것은 매우 혼란스럽고, 경로 수가 증가함에 따라 혼란 스러울뿐입니다.

명명 된 인스턴스를 사용하지 않고 다른 컨트롤러 인스턴스화 전략을 허용 할 수있는 대체 방법이 있습니까? 별도의 컨트롤러를 생성하고 주어진 컨트롤러의 모든 액션이 리파지토리/DAO 클래스의 동일한 구체적인 인스턴스에 유효한지 확인하는 것이 더 좋은 아이디어일까요?

답변

0

가치가있는 것을 위해, 각 인스턴스의 이름은 MVC 프레임 워크가 URL에서 가져온 컨트롤러의 이름을 기반으로하는 명명 된 인스턴스로 끝납니다.

예를 들어 URL /foo/DoSomething은 데이터 액세스를 위해 SqlClient API를 사용하는 리포지토리 개체로 인스턴스화 된 ObjectFactory에서 IController 인스턴스를 가져올 수 있습니다. /foo.webservice/DoSomething과 같은 URL은 동일한 구체적인 컨트롤러 클래스의 인스턴스를 만들고 데이터 액세스를 위해 웹 서비스를 사용하는 리포지토리 개체의 인스턴스 생성자를 전달합니다.

생성자 인수에 대한 StructureMap의 기본 자동 배선 동작을 재정의하는 데는 여러 가지 방법이 있습니다. 내 경우에는 CtorDependencyIs 메서드를 사용했으며 다음과 같은 매핑을 사용했습니다 ...

// create a named instance for the "foo" controller that uses the SqlClient based repository 
InstanceOf<IController>() 
    .Is.OfConcreteType<FooController>() 
    .CtorDependency<IFooRepository>() 
    .Is(new FooRepositorySql(Constants.FooConnectionString)) 
    .WithName("foo"); 

// create a named instance for the "foo.webservice" controller that uses the Web Service based repository 
InstanceOf<IController>() 
    .Is.OfConcreteType<FooController>() 
    .CtorDependency<IFooRepository>() 
    .Is(new FooRepositoryWs(Constants.FooServiceUrl)) 
    .WithName("foo.webservice");