Я проектирую слабо связанную структуру. Я хочу, чтобы вызывал классы из разных сборок/пространств имен через код, который представлен строкой. Мой дизайн заключается в том, что каждый из бизнес-правил клиента находится на разных собраниях и не зависит друг от друга (ОДИН клиент относится к ОДНОМ DLL-соотношению), поэтому, когда я сделал обновление бизнес-правил 1 клиента, это не повлияет на других. Теперь я обратил внимание на использование Factory Design и использование метода Activator.CreateInstance().Activator.CreateInstance: динамическое создание объектов
Это проект установки (2 + п библиотек)
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
Реальный код
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();
}
Любая идея, почему мой пример не работает? И любое предложение по улучшению дизайна? Спасибо заранее.
Как об использовании
Expression.Lambda
кого?
Да, я хочу, чтобы сохранить параметр как есть. – CSharpNoob
Он по-прежнему выдает ошибку при передаче «Client1» по параметру с помощью вашего кода. – CSharpNoob
. Вам необходимо иметь Client1.dll в том же каталоге, что и исполняющая сборка. Если это не работает: что такое сообщение об ошибке и на какой строке оно выбрано? – TToni