Jaka jest dobra struktura rozwiązania, aby umożliwić łatwe dostosowanie produktu do potrzeb klienta?

Szukam porady, jak umożliwić łatwe dostosowanie i rozszerzenie podstawowego produktu na klienta. Wiem, że to chyba zbyt duże pytanie. Jednak naprawdę potrzebujemy kilku pomysłów, jak gdybyśmy otrzymali błędną konfigurację, która mogłaby powodować problemy przez lata. Nie mam dużego doświadczenia w dostosowywaniu i rozszerzaniu istniejących produktów.

Mamy podstawowy produkt, który zwykle wykonujemy na zamówienie klienta. Niedawno przepisaliśmy produkt w C # 4 z nakładką MVC3. Odnowiliśmy i teraz mamy 3 projekty, które tworzą rozwiązanie:

Projekt domeny podstawowej (przestrzeń nazw - nazwa projektu.domena. *) - składający się z modeli domeny (do wykorzystania przez EF), interfejsów usług domenowych itp. (Interfejsy repozytoriów)Projekt infrastruktury domeny (przestrzeń nazw-nazwa projektu.infrastruktura. *) - który implementuje usługę domeny-kontekst kontekstowy EF, implementację repozytorium, implementacje przesyłania plików / pobierania itp.MVC3 (przestrzeń nazw - nazwa_projektu.web. *) - projekt składający się z kontrolerów, viewmodeli, CSS, treści, skryptów itp. Posiada również obsługę IOC (Ninject) dla projektu.

To rozwiązanie działa dobrze jako samodzielny produkt. Nasz problem polega na rozszerzaniu i dostosowywaniu produktu do potrzeb klienta. Nasi klienci zazwyczaj potrzebują podstawowej wersji produktu, którą otrzymują bardzo szybko (zwykle w ciągu kilku dni od podpisania umowy) z markowym CSS i stylizacją. Jednak 70% klientów chce dostosowań, aby zmienić sposób działania. Niektóre dostosowania są małe, takie jak dodatkowe właściwości na modelu domeny, model widoku i widok itp. Inne są bardziej znaczące i wymagają całkowicie nowych modeli domen i kontrolerów itp.

Niektóre dostosowania wydają się być użyteczne dla wszystkich klientów, dlatego okresowo chcielibyśmy je zmienić z dostosowań i dodać je do rdzenia.

Obecnie przechowujemy kod źródłowy w TFS. Aby rozpocząć projekt, zazwyczaj ręcznie kopiujemy źródło do nowego projektu zespołowego. Zmień przestrzeń nazw, aby odzwierciedlić nazwę klienta i rozpocząć dostosowywanie podstawowych części, a następnie wdrożyć na platformie Azure. To oczywiście prowadzi do całkowicie zduplikowanej bazy kodu i jestem pewien, że nie jest to właściwy sposób, aby to zrobić. Myślę, że prawdopodobnie powinniśmy mieć coś, co zapewnia podstawowe funkcje i rozszerza / zastępuje w razie potrzeby. Jednak naprawdę nie jestem pewien, jak się do tego zabrać.

Dlatego szukam wszelkich porad dotyczących najlepszej konfiguracji projektu, która pozwoliłaby na:

Szybkie wdrożenie kodu - tak łatwo uruchomić nowego klienta, aby umożliwić branding / drobne zmianyZapobiegaj kopiowaniu i wklejaniu koduUżycie jak największej ilości DI, aby luźno się ze sobą połączyćPozwól na zamówienie kodu dla każdego klientaMożliwość rozszerzenia podstawowego produktu w jednym miejscu i umożliwienia wszystkim klientom uzyskania tej funkcjonalności, jeśli otrzymamy najnowszą wersję rdzenia i ponownie wdrożymy

Każda pomoc / rada jest bardzo mile widziana. Z przyjemnością dodam więcej informacji, o których każdy myśli, że pomoże.

questionAnswers(2)

yourAnswerToTheQuestion