我正在设计一个松耦合的结构。我想通过字符串表示的代码从不同的程序集/命名空间中调用类。我的设计是,每个客户的业务规则都在不同的程序集上并且彼此不依赖(一个客户与一个DLL的比率),因此当我对1个客户的业务规则进行更新时,它不会影响其他客户。我现在的注意力是在使用Factory Design和Activator.CreateInstance()方法。

这是项目设置(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


实际代码

 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();
  }


知道为什么我的样本无效吗?还有改进设计的建议吗?
提前致谢。

怎么样使用


表达式Lambda


任何人?

最佳答案

如果您使用FetchInstance(“ Client.BusinessRules”),则如果所有内容都在同一程序集中,则代码可以正常工作。如果不是(根据您的设计),则需要给出AssemblyQualifiedName

但是我会做不同的设计。仅使用“ Client1”作为参数来保持通话,但更改Factory的实现。动态加载给定客户端的程序集(使用Assembly.Load()或Assembly.LoadFrom()),然后使用clientAssembly.CreateInstance()来确定您的类型。

编辑:原始代码示例:

namespace Factory
{
  public static class Invoker<T> where T: IBusinessRules
  {
    public static T FetchInstance(string clientCode)
    {
        var clientAssembly = Assembly.LoadFrom(clientCode + ".dll");

        return (T)clientAssembly.CreateInstance(clientCode+".BusinessRules");
    }
  }
}


如果您不知道client-dll中的类名,则必须搜索适用的Type,例如,使用clientAssembly.GetTypes()。

关于c# - Activator.CreateInstance:类的动态实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3727433/

10-11 18:31