J'aimerais avoir des conseils sur la meilleure approche à adopter dans la situation suivante...
Je disposerai d'une application Windows et d'une application Web (couches de présentation), qui accéderont toutes deux à une couche métier commune. La couche métier consultera un fichier de configuration pour trouver le nom de la dll (couche de données) vers laquelle elle créera une référence au moment de l'exécution (est-ce la meilleure approche ?).
La raison pour laquelle la référence à la couche d'accès aux données est créée au moment de l'exécution est que l'application s'interfacera avec un système comptable tiers différent en fonction de ce que le client utilise. J'aurais donc une couche d'accès aux données distincte pour chaque système de comptabilité. Il pourrait s'agir de projets d'installation distincts, chaque client utiliserait l'un ou l'autre, il n'aurait pas besoin de passer d'un système à l'autre.
Projets :
MyCompany.Common.dll - Contient des interfaces, tous les autres projets ont une référence à celui-ci.
MyCompany.Windows.dll - Projet Windows Forms, références MyCompany.Business.dll
MyCompany.Web.dll - Projet de site web, références MyCompany.Business.dll
MyCompany.Busniess.dll - Business Layer, références MyCompany.Data.* (au moment de l'exécution)
MyCompany.Data.AccountingSys1.dll - Couche de données pour le système comptable 1 MyCompany.Data.AccountingSys2.dll - Couche de données pour le système comptable 2
Le projet MyCompany.Common.dll contiendrait toutes les interfaces, chaque autre projet aurait une référence à celui-ci.
Public Interface ICompany
ReadOnly Property Id() as Integer
Property Name() as String
Sub Save()
End Interface
Public Interface ICompanyFactory
Function CreateCompany() as ICompany
End Interface
Le projet MyCompany.Data.AccountingSys1.dll y MyCompany.Data.AccountingSys2.dll contiendrait les classes suivantes :
Public Class Company
Implements ICompany
Protected _id As Integer
Protected _name As String
Public ReadOnly Property Id As Integer Implements MyCompany.Common.ICompany.Id
Get
Return _id
End Get
End Property
Public Property Name As String Implements MyCompany.Common.ICompany.Name
Get
Return _name
End Get
Set(ByVal value as String)
_name = value
End Set
End Property
Public Sub Save() Implements MyCompany.Common.ICompany.Save
Throw New NotImplementedException()
End Sub
End Class
Public Class CompanyFactory
Implements ICompanyFactory
Public Function CreateCompany() As ICompany Implements MyCompany.Common.ICompanyFactory.CreateCompany
Return New Company()
End Function
End Class
Le projet MyCompany.Business.dll fournira les règles de gestion et récupérera les données de la couche de données :
Public Class Companies
Public Shared Function CreateCompany() As ICompany
Dim factory as New MyCompany.Data.CompanyFactory
Return factory.CreateCompany()
End Function
End Class
Tout avis/suggestion serait grandement apprécié.