문제

우리는 현재 개발의 새로운 조각 손으로 개최된 소프트웨어입니다.가 토론 응용 프로그램의 특성,그래서 그 사용하여 예를 대신 합니다.

우리는 손으로 설계되는 소프트웨어를 관리하기 위한 학교입니다.우리가 원하는 modularise 각 측면이 시스템의 다른 학교 사용할 수 있는 차별화되는 특징을 가지고 있다.

우리의 시스템과 함께 시작 메인 메뉴는 로그인 화면.나는 다음과 같이 될 것을 기반 시스템의 수 있는 모듈을 추가될 것입니다.I.e.나이 있을 것이라는 프로젝트 SchoolPda.

나는 다음을 서로 다른 모듈을 사용합니다.I.e., 내가 원하는 모듈 등록을 처리하는 학생의 등록한다.내가 원하는 교실을 위한 모듈을 관리하는 교실 청결 등입니다.

방법 나는 가능하게 이 작업은 포함하여/포함되지 않은 다른 dll 을 갖는 베이스 시스템의 기본 메뉴에 노출 버튼에 액세스하는 경우 모듈 dll 을 존재합니다.는 종류의 것은 우리는 우리 후.

누군가가 어떤 경험을 하고 있다.무엇을 할 수있는 가장 좋은 방법이 될 것이의 그것을 하고 있는가?우리는 걱정할 필요가 없는 데이터베이스에 대한 데이터베이스로 항상 전체 데이터베이스하지만,측면을 못 채워지는 경우에는 관련된 모듈이 존재하지 않습니다.

도움이 되었습니까?

해결책

나는 두 가지 방법을 수행 한 프로젝트에있었습니다.

  • 한 프로젝트에서 고객이 라이센스가없는 경우 특정 DLL을 배포하지 않았습니다. 그것이 당신이 제안하는 것입니다. 잘 작동했습니다. 물론 추가 설치없이 해당 모듈을 활성화 할 수있는 방법은 없었지만 해당 앱에 완벽하게 맞습니다.

  • 다른 프로젝트에서 우리는 모든 것을 배포하고 고객이 라이센스를 부여받은 메뉴, 버튼 등을 최종 사용자에게만 노출했습니다. 우리는 사용자가 라이센스를 추가하여 추가 모듈을 쉽게 추가 할 수 있었기 때문에 그렇게했습니다. 라이센스가 추가되면 다음 로그인시 마술처럼 나타났습니다.

내 경험에 따르면, 나는 당신의 라이센스 모델을 당신의 결정의 하나의 큰 부분으로 살펴볼 것이라고 말할 것입니다. 추가 모듈을 즉시 추가하고 싶은지 생각해보십시오.

다른 팁

나는 현재도 개발하기에서 실행되는 애플리케이션을 모두 컴팩트하고 전체 프레임워크가 내장된 모듈이다.

방법은 구현되는지 검사한 위치에 대한 dll 및 enummerates 각 유형을 보인다면 그들은"ScreenInfoAttribute"또는"WidgetInfoAttribute"정의된 포함하는 유용한 정보에 대해 클래스입니다.

여기에 조각을 포함하고,3.5 코드,하지만 그것 때문에 우리는 최근 스위치 2.0 에서지만,그 원리에서 작동 2.0

public void Analyze(FileInfo file) {
        Assembly asm = Assembly.LoadFrom(file.FullName);
        List<Data.AnyPlugin> types = GetPluginTypes(asm.GetTypes());

        if (types.Count > 0) {
            types.ForEach(x => x.AssemblyPath = file.FullName);
            if (_plugins.ContainsKey(file.FullName)) {
                _plugins[file.FullName].Plugins.AddRange(types);
            } else {
                AssemblyPlugin asp = new AssemblyPlugin();
                asp.Ass = asm;
                asp.Plugins = types;
                _plugins.Add(file.FullName, asp);
            }
        }
    }

    private List<Data.AnyPlugin> GetPluginTypes(Type[] types) {
        List<Data.AnyPlugin> returnTypes = new List<AnyPlugin>();
        foreach (Type t in types) {
            Data.AnyPlugin st = GetPluginType(t);
            if (st != null) returnTypes.Add(st);
        }
        return returnTypes;
    }

    private Data.AnyPlugin GetPluginType(Type type) {
        if (type.IsSubclassOf(typeof(Screens.bScreen<T>))) {
            Screens.ScreenInfoAttribute s = GetScreenAttrib(type);
            if (s != null) {
                return new Data.ScreenPlugin("", type, s);
            }
        } else if (type.IsSubclassOf(typeof(Widgets.bWidget<T>))) {
            Widgets.WidgetInfoAttribute w = GetWidgetAttrib(type);
            if (w != null) return new Data.WidgetPlugin("", type, w);
        }
        return null;
    }

    private Screens.ScreenInfoAttribute GetScreenAttrib(Type t) {
        Attribute a = Attribute.GetCustomAttribute(t, typeof(Screens.ScreenInfoAttribute));
        return (Screens.ScreenInfoAttribute)a;
    }

CLR에서 작동하는지 모르겠지만 Mef, DLL / 모듈을 발견하고로드하는 방법을 만들기 위해. 또한 모듈에 필요한 정보를 가져 오는 getMenuitem 메소드 (또는 ILK의 무언가)가있어 메인 메뉴가 버튼을 추가 할 수 있습니다.

분명히, 메인 메뉴에 다른 디자인을 사용하여 이해가되지만 진정으로 조절되고 확장 가능하게되기를 원하므로 핵심을 작성할 수 있으며 앞으로는 미래에 새로운 구성 요소를 계속 작성하지 않아도됩니다. 핵심을 바꾸십시오.

이것이 가장 큰 의미가 없다면 죄송합니다. 한 방향으로 아이디어를주기를 바랐습니다.

모든 모듈이 공통 인터페이스를 구현하도록하십시오. getButtons () 또는 getActions ()와 같은 메소드를 추가하십시오.

그런 다음 구성 - 파일에 어셈블리 이름과 클래스 이름에 대한 정보를 배치 할 수 있습니다. 이제 지정된 어셈블리를 쉽게로드하고 Activator.createInstance를 사용하여 클래스의 인스턴스를 만들 수 있습니다. 인터페이스에 캐스팅하고 getButtons () 등을 호출하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top