2010-07-16 2 views
5

저는 해결하기가 힘든 문제가 있습니다. 생각하고 검색하여 한 가지 결론을 내 렸습니다. 문제는 공통 기능을 기반으로 웹 사이트를 만들려는 클라이언트가 있기 때문에 모듈이라고 부르겠습니다. MVC를 사용하여 모듈을 연결하는 훌륭한 아이디어 인 Portable Areas를 사용하는 것이 좋습니다. 큰 문제는, 그가 원하는 새로운 사이트에서 구현 될 블로그 모듈을 만들었습니다. 이제는 일부 사용자가 각 기사에 그림 갤러리를 추가해야하는 것과 같이 고유 한 요구 사항을 갖거나 각 기사의 참조 목록을 작성해야합니다. . 그래서 모두 당신이해야 할 무엇복잡한 모듈 기반 ASP.NET MVC 2를 사용하여 DB에 새 레코드 만들기

  • 이 블로그 테이블에 대한 외래 키와 함께 새로운 갤러리 테이블을 추가 당신이에 작업 한 사이트가 어디 이 정상적인 상황에서 쉬운 것입니다.
  • Linq2SQl 코드를 재생성하고 모델을 업데이트하십시오.
  • 만들기, 편집, 삭제보기에 새 양식 요소를 추가하십시오.
  • 컨트롤러에 논리를 추가하십시오.

하지만 새로운 기능이 멋진 와 클라이언트가 모든 사이트에서 그것을 구현하기로 결정하는 경우 2 가지 이유

  • , 그때가를 반복해야하기 때문에 내 상황이 복잡 복잡하고 시간이다 각 사이트에 대한 작업.
  • 기능은 그것이 미래

에 나를 위해 일관성을 만듭니다 고유 한 경우 왜 지금이 확실히 내 일을 쉽게 할 것이다, 각 모듈에 대한 부가 기능을 만들 휴대용 영역을 사용하는 문제를 해결하기위한 첫 번째 단계로 각각의 새로운 모듈이나 애드온 1 DLL을 드래그,하지만 난 새로운 모듈 또는 추가 기능이 DLL이 있기 때문에 어떤

  • , 여기에 약간의 문제가에 의해, 어떻게 내 관리자 패널에서 이러한 기능을 만들 수 있습니다 새 Addon을 설치하거나 새로운를 찾으십시오.는 모듈/부가 기능, 휴대용 지역 내에서 업데이트와 같은 를 설치 절차를 만들 연습 DB를, 새로운 경로 등 최고의 무엇 메인 응용 프로그램
  • 에 새로운 DLLS에게 를 끌고 추가 .. : 모듈 부가 기능에 고유 한 가장 큰 문제로 이제

우리가 내가 휴대용 영역으로 만들어 위에서 언급 한 논리를 따른다면, 그것은 쉬울 것, 기사 갤러리 부가 기능을 다시 보자 모듈 코드에 기능을 생성하여 설치된 모든 애드온을 반복하고 CRUD 뷰에 나열합니다.하지만 Addon을 격리하고 위의 이유에 대한 Main Module Code를 수동으로 업데이트하고 싶지 않기 때문에 외래 키 관계가 없기 때문에 메인 모듈과 동기화 된 새로운 Addons에 대한 CRUD 작업을 수행합니다. 위의 옵션은 선택 사항 일 수 있기 때문에 다시 한 가지 더 좋은 방법이 될 수 있기를 바랍니다.

설치 과정에서 첫 번째 갤러리 Addon에 대한 표를 만들지 만 외래 키 관계를 만드는 대신 수동 외래 키를 만듭니다.이 외래 키는 다음을 사용하여 레코드를 만들 때 주 모듈 컨트롤러에서 고유 ID 생성으로 채워집니다. 다음 코드는

  • 이 가능하거나 바보 다만 보통 이런 식으로는 내 관심사는 여기에 다음을 ViewData에 저장 나는 새로운 기록을 만들 때 단지 부가 기능 컨트롤러에 전달,

    private string GenerateId() 
    { 
        long i = 1; 
        foreach (byte b in Guid.NewGuid().ToByteArray()) 
        { 
        i *= ((int)b + 1); 
        } 
        return string.Format("{0:x}", i - DateTime.Now.Ticks); 
    } 
    ViewData["FK"] = GenerateId(); 
    

    을하지만, .

  • 이 기술은 진정한 고유 키를 생성합니다.

내 질문은 절름발이 경우 매우 죄송하지만,이 물어 최고의 장소이며, 나는 많은 사람들이 그런 기능을 할 것이라고 생각하고 나는 그것이 생각 누군가가 나에게

+2

전혀 답답한 질문이 아니지만 약간의 생각이 필요한 설계상의 질문입니다. 나는 당신의 데이터베이스 디자인이 자신의 ID를 만들 것을 요구해서는 안된다고 생각한다.필자 본능은 플러그인 정보를 모두 포함하는 테이블이 필요하다는 것입니다 (플러그인을 구분할 수있는 추가 열이 있음). 이렇게하면 모든 플러그인에 대해 동일한 Linq to SQL 스키마를 사용할 수 있습니다. 특정 플러그인에 대한 고유 한 정보가있는 경우 해당 플러그인의 고유 한 정보에 대해 별도의 Linq to SQL 스키마를 작성할 수 있습니다. –

+1

별도의 Linq to SQL 스키마는 플러그인과 함께 사용할 수 있으므로 고유 한 정보가 포함 된 플러그인을 추가 할 때마다 기본 Linq를 SQL 스키마로 업데이트 할 필요가 없습니다. 이것은 문제가 잠재적으로 해결 될 수있는 많은 방법 중 하나 일뿐입니다. –

+0

감사합니다.하지만, 플러그인 스키마에만 플러그인 테이블을 포함시켜야한다고 정확히 말해 줄 수 있습니까? 여전히 존재하는 또 다른 문제는 내가 플러그인을 사용하여 새로 삽입 한 레코드를 어떻게 연결할 수 있습니까? 내가 언급했거나 더 좋은 방법이 있습니까? – DevMania

답변

2

답변 바랍니다 좋은 질문입니다. 얼마 전에 MVC1을 사용하는 CMS 프로젝트에서 작업하기 시작했습니다. MVC1은 플러그인을 지원하고 싶었습니다. 관리자가 bin 폴더에 새 플러그인 어셈블리를 놓을 수 있도록 작업 했으므로 다음 응용 프로그램 시작은 IPlugin (또는 무엇이든)에 대한 모든 어셈블리를 검색하여로드합니다. 플러그인 어셈블리에 부분 뷰를 임베드하여 자체적으로 포함 시켰습니다. 각 플러그인은 페이지에 배치 될 때 고유 한 식별자가 주어졌고 플러그인의 컨트롤러는 해당 ID를 사용하여 데이터의 자체 테이블 (리포지토리)을 쿼리하는 방법을 알고있었습니다. 주요 응용 프로그램은 플러그인의 스키마에 대해 아무 것도 몰랐습니다.

유일한 차이점은 동일한 데이터베이스에서 여러 웹 사이트를 실행하는 것처럼 들리므로 각 웹 사이트에 필요한 플러그인의 인스턴스를 구분해야합니다. 나는 어딘가에 어떤 웹 사이트인지를 나타내는 키를 가지고 있다고 가정하고, 외부 키를 통해 사용자가있는 페이지에 대한 웹 사이트의 플러그인 만 선택할 수 있습니다.

답이 맞는지 확실하지 않습니다. 나는 큰 소리로 생각하고 있습니다. 잘하면이 토론에 조금 도움이 될 것입니다.

EDIT : 플러그인을 자동으로로드하기 위해 NInject의 IModules 용 어셈블리 스캔 기능을 사용했습니다. 내 IPlugin은 Ninject.Modules.INinjectModule에서 상속 받고 모든 플러그인은 IPlugin 인터페이스를 구현합니다. 그런 다음 응용 프로그램 시작에, 나는 다음과 같은 라인을 가지고 :

kernel.Load("*.Plugin.dll"); 
커널이 Ninject.IKernel 해당 파일 패턴과 일치하는 모든 어셈블리를 검색합니다 그 라인, 그래서 내가 Weather.Plugin.dll 같은 어셈블리에 떨어질 수

.

+0

하중을 생각해 주셔서 고마워, 실제로 내가하고 싶은 것이 당신과 같고, 사이트가 하나의 중앙 DB에서 실행되고 있지 않다는 것을 의미합니다. 기본 DB 스키마가 각 사이트에서 반복 될 것입니다. 제 문제는 나는 강력한 외래 키 관계를 가지고 새로 삽입 된 메인 블로그 기사의 ID를 얻으려고합니다. 예를 들어, 내가 쿼리 할 때 그들을 연결할 수 있습니다. 나는 멀리 찾을 수 없을 것 같습니다. 다른 건, 할 수 있습니다. 당신은 그 새 어셈블리를 검색하는 방법을 말해, 어떤 작은 코드도 도움이 될 것을 의미합니다 :) – DevMania

+1

내 대답 승/스캔 코드 승. 나는 당신이 "쿼리 할 때 함께 연결하여"무슨 뜻인지 모르겠다. 네가하려는 일을 말해 줄 수 있니? –

+0

keeol man, 내가 질문 할 때 의미하는 바는 위의 질문을 읽었을 때 기본 Blog Module이 있고 어쩌면 기사에 이미지를 추가 할 수있는 새로운 Addon (Plugin) 이제 내가 언급 한 것처럼 내 문제는 내가 어떻게 새로운 기사를 삽입 할 때, 나는 그것의 ID를 얻을 수있을 것이고 갤러리 플러그인에서 외래 키가되도록 할 것이다. 그래서 내가 기사를 보여주고 싶을 때 나는 기사 테이블에 가입 할 수있다. + Gallery Plugin 테이블, 기본적으로 내 투쟁은 내가 새로운 작업 ID를 얻고 예를 들어 액션 – DevMania