2013-04-14 20 views
1

我在.net 4.5中开发了一个Web应用程序,现在客户要求我为某些应用程序模块(例如发票的不同实现)定制。 我的问题是我可以“拦截”我的客户加载定制组装并为一般客户加载不同的组装?为不同的客户端加载不同的程序集或模块

我可以简单地通过反射吗?

回答

1

关键的想法是设计软件的方式可以很容易地更换其部件。您应该将解决方案分成多个项目,以便快速交换不同的接口实现。

此外,有一件事叫做依赖注入,它基本上意味着你可以根据你的需要在运行时或者使用一个配置文件的情况下注入不同的实现。为了便于使用,已经为您准备好了很好的框架,例如Ninject或Unity。

应用程序需要有坚实的架构来支持这种可能性。也许如果你提供了关于你的系统的更多信息,我可能会更具体,但我相信对依赖注入做一些研究会给你一个好的开始。

+0

我只是有一个单独的解决方案,并使用ninject。我的问题是,如果应用程序是SaaS,我是否可以加载“模块”的版本控制组件而无需为我的客户重新安装单独的应用程序? – TheNeXt

+1

如果您已经在使用ninject,并且已经选择了在外部文件而不是代码中定义映射的路径,那么我相信这是可能的。只需将新的dll复制到应用程序文件夹并修改包含映射的ninject设置文件。试一试:)然而,如果你不能像这样控制它,那么我认为它不会那么容易,你必须修改核心文件才能实现。有可能(不太确定)拦截电话和东西的一些方法,但我不认为这是一个好主意。 – walther

0

是的,你可以。您可以从文件加载程序集,如下所示: var asmbly = System.Reflection.Assembly.LoadFrom(path); 然后使用反射来加载类型。

有几种方法可以实现这种可插拔性。一种方法是提取“模块”的接口并为您的“模块客户端”再次编写接口,将具体实现与“客户”代码分离。然后,在运行时查看组件,加载实现所述接口的类型并注入“模块客户端”。

我在这里粘贴一些代码,我已经写了作为一个概念证明的exacly这种类型的“模块”运行时装载的(这是MVC 3):

// "Module User" was decoupled from "module", by coding it against module's interface: 
public class CustomerController : Controller 
{ 
    private ICustomerRepository _customerRepository; 

    // dependency injection constructor 
    public CustomerController(
      ... 
      ICustomerRepository customerRepository, 
      ...) 
    { 
      _customerRepository = customerRepository; 
    } 


    public ActionResult Details(Nullable<Guid> id) 
    { 
      Customer c = _customerRepository.GetByKey(id.Value.ToString()); 
      ... 
    } 

    ... 
} 

在运行时:

// I first load the assembly 
System.Reflection.Assembly dal = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(pBinPath, pDALAssemblyName)); 

// I then look for types implementing ICustomerRepository 
var addressRepositoryContract = typeof(QSysCamperCore.Domain.IAddressRepository); 
var addressRepositoryImplementation = dal.GetTypes() 
    .First(p => addressRepositoryContract.IsAssignableFrom(p)); 
... 

注意,这类型的节目需要更多一点的权限 - 我对这个代码已经几年“生锈”,但我记得与信任度的问题,当然,文件系统访问有要考虑。


有框架可以帮助这样的应用程序风格。这已经有几年了,但过去在微软的模式和实践网站上有所谓的“复合应用程序块”,它是两个框架--Smart Cliet Softweare工厂和它的Web对等 - Web客户端软件工厂的基础。他们有点重一些站起来,但为这种模块化(复合)应用提供了gread骨架。

相关问题