Je suis en train de concevoir une structure faiblement couplée. Je veux appeler des classes de différents assemblys/namespaces via un code qui est représenté par une chaîne. Ma conception est que chacune des règles métier du client est sur des assemblages différents et ne dépend pas l'un de l'autre (un client est à un ratio DLL) de sorte que lorsque je fais une mise à jour sur les règles métier de 1 client, cela n'affecte pas les autres. Mon attention est maintenant sur l'utilisation de Factory Design et en utilisant Activator.CreateInstance() Méthode.Activator.CreateInstance: Instanciation dynamique des classes
Ceci est la configuration du projet (2 + n DLL)
namespace Foundation; // where the interfaces/abstract resides
namespace Factory; // has dependency on Foundation assembly
namespace Client1; // client1's DLL, no dependency
namespace Client2; // client2's DLL, no dependency
The UI // only referenced to the Foundation and Factory not the Clients
Le code réel
namespace Foundation
{
public interface IBusinessRules
{
string GetBusinessRule();
}
}
namespace Client1 //DLL for client 1
{
public class BusinessRules : Foundation.IBusinessRules
{
public string GetBusinessRule()
{
return "Client1 Business Rule";
}
}
}
namespace Client2 //DLL for client 2
{
public class BusinessRules : Foundation.IBusinessRules
{
public string GetBusinessRule()
{
return "Client2 Business Rule";
}
}
}
namespace Factory
{
public static class Invoker<T> where T: Foundation.IBusinessRules
{
public static T FetchInstance(string clientCode)
{
return (T)Activator.CreateInstance(Type.GetType(clientCode));
}
}
}
//sample implementation that generates unhandled Exception
using Factory;
using Foundation;
static void Main(string[] args)
{
//the parameter is maintained in the database
IBusinessRules objClient1 = Invoker<IBusinessRules>.FetchInstance("Client1");
//should call Client1.BusinessRules method
Console.WriteLine(objClient.GetBusinessRule());
Console.Read();
objClient = Invoker<IBusinessRules>.FetchInstance("Client2");
//should call Client2.BusinessRules method
Console.WriteLine(objClient.GetBusinessRule());
Console.Read();
}
Toute idée pourquoi mon exemple ne fonctionne pas? Et toute suggestion pour améliorer la conception? Merci d'avance.
Comment l'utilisation
Expression.Lambda
quelqu'un?
Oui, je veux garder le paramètre comme il est. – CSharpNoob
Il jette toujours une erreur lorsque je passe "Client1" sur le paramètre en utilisant votre code – CSharpNoob
Vous devez avoir le Client1.dll dans le même répertoire que l'assembly en cours d'exécution. Si cela ne fonctionne pas: Quel est le message d'erreur et à quelle ligne est-il lancé? – TToni