2013-04-14 2 views
1

.net 4.5에서 웹 응용 프로그램을 개발 했으므로 이제 고객이 응용 프로그램 모듈 (예 : 청구서의 다른 구현)에 대한 사용자 정의를 묻습니다. 제 질문은 고객 맞춤 어셈블리를로드하고 일반 고객을 위해 다른 어셈블리를로드하도록 고객을 "가로 챌 수 있습니까?"다른 클라이언트에 대해 다른 어셈블리 또는 모듈로드

리플렉션을 통해 간단하게 할 수 있습니까?

답변

1

중요한 아이디어는 소프트웨어를 부품을 쉽게 교체 할 수있는 방법으로 설계하는 것입니다. 솔루션을 여러 프로젝트로 분리해야 인터페이스의 여러 구현을 신속하게 바꿀 수 있습니다.

또한 Dependency Injection이라는 것이 있습니다. 이는 기본적으로 런타임 중에 또는 구성 파일을 사용하여 필요에 따라 다른 구현을 삽입 할 수 있음을 의미합니다. 사용 편의성을 위해 이미 Ninject 또는 Unity와 같은 멋진 프레임 워크가 준비되어 있습니다.

응용 프로그램에는 이러한 가능성을 지원할 수있는 견고한 아키텍처가 필요합니다. 어쩌면 시스템에 대한 더 많은 정보를 제공했다면 더 구체적 일 수 있었지만, 의존성 주입에 대한 연구를하면 좋은 시작이 될 것이라고 믿습니다.

+0

난 그냥 별도의 솔루션을 가지고 있고 사용하십시오. 내 질문은 응용 프로그램이 SaaS 인 경우 내 고객을 위해 별도의 응용 프로그램을 다시 설치하지 않고도 "모듈"의 버전 관리 어셈블리를로드 할 수 있습니까? – TheNeXt

+1

이미 ninject를 사용하고 있는데 코드에서가 아니라 외부 파일에 매핑을 정의하는 경로를 선택한 경우에는 가능하다고 생각합니다. 새 dll을 응용 프로그램 폴더에 복사하고 매핑이 들어있는 ninject 설정 파일을 수정하기 만하면됩니다. 시도해라. :) 그러나 만약 당신이 이것을 통제 할 수 없다면, 그렇게 쉽지는 않을 것이라고 생각한다. 핵심 파일을 수정할 수 있어야한다. 아마 전화와 물건을 가로 채기위한 몇 가지 방법이 있을지는 모르겠지만 좋은 생각이라고 생각하지는 않습니다. – walther

0

예, 가능합니다. 다음과 같이 파일에서 어셈블리를로드 할 수 있습니다. var asmbly = System.Reflection.Assembly.LoadFrom(path); 그런 다음 리플렉션을 사용하여로드 유형을 지정합니다.

이 방법은 여러 가지 방법으로 사용할 수 있습니다. 한 가지 방법은 "모듈"의 인터페이스를 추출하고 "모듈 클라이언트"를 다시 인터페이스하는 코드로, 구체적인 구현을 "클라이언트"코드에서 분리하는 것입니다. 그런 다음 런타임에 assempbly 내부를보고 인터페이스를 구현하는 유형을로드하고 "모듈 클라이언트"에 주입합니다. 런타임에

// "Module User" was decoupled from "module", by coding it against module's interface: 
public class CustomerController : Controller 
{ 
    private ICustomerRepository _customerRepository; 

    // dependency injection constructor 
    public CustomerController(
      ... 
      ICustomerRepository customerRepository, 
      ...) 
    { 
      _customerRepository = customerRepository; 
    } 


    public ActionResult Details(Nullable<Guid> id) 
    { 
      Customer c = _customerRepository.GetByKey(id.Value.ToString()); 
      ... 
    } 

    ... 
} 

:

내가 여기에 내가 "모듈"의 런타임로드의 exacly 유형에 대한 개념의 증거로 작성한 몇 가지 코드를 붙여 넣기하고 (이것은 MVC 3)

// I first load the assembly 
System.Reflection.Assembly dal = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(pBinPath, pDALAssemblyName)); 

// I then look for types implementing ICustomerRepository 
var addressRepositoryContract = typeof(QSysCamperCore.Domain.IAddressRepository); 
var addressRepositoryImplementation = dal.GetTypes() 
    .First(p => addressRepositoryContract.IsAssignableFrom(p)); 
... 

주, 프로그래밍이 유형의 좀 더 권한을 필요로 - 물론, 파일 시스템 액세스가 있으며,이 코드에 이미 몇 년 "녹슨",하지만 나는 신뢰 수준에 문제를 기억하고 고려해야 할 사항.


이러한 응용 스타일을 지원하는 프레임 워크가 있습니다. 이것은 몇 년 전의 일이지만, Smart Cliet Softweare Factory와 웹 클라이언트 인 Web Client Software Factory의 두 프레임 워크의 기반 인 Microsoft의 Patterns and Practices 사이트에 소위 "복합 애플리케이션 블록"이있었습니다. 일어 서기 위해 좀 더 무거웠지만 그러한 모듈화 된 (복합적인) 어플리케이션을위한 뼈대를 제공했습니다.

관련 문제