独立运行库

时间:2013-06-28 22:54:01

标签: c# .net dependency-injection remoting isolation

几周前我开始在DI框架中工作(只是为了好玩),在构建它时我遇到了以下问题。基本上我们大多数人都关心使用DI框架,以便我们对接口而不是实现进行编码,我完全赞同这个SOLID原则 - 我自己也是DI框架的忠实粉丝/用户 - 但我们的代码依赖于第三方库,因为例如.NET不提供开箱即用的DI功能。当然他们有MEF和Unity,但那些是外部库。

因此,如果我想使用DI,我必须使用第三方库,并确保我的项目引用它,除此之外,我将我的应用程序暴露给库中可能出现的运行时问题,例如:未处理的例外。

我无法解决使用DI库的组件需要引用它的事实(至少现在还没有),但我需要一个异常的解决方案:DI库中发生的未处理异常需要保留在库,即没有传播到客户端应用程序,是的井设计库应该处理所有异常,但软件并不完美。

实现这一目标的最简单方法是使用ApplicationDomains,并使用.Net Remoting和命名管道进行进程间通信。我需要知道的是,如果有其他方法可以使用其他工具/流程创建这种隔离。

由于

更新

看了一下之后,我发现无需直接使用.Net Remot就可以轻松实现:

public interface IRuntime
{
    bool Run();
}

public class Runtime : MarshalByRefObject, IRuntime
{
    public bool Run()
    {
        throw new NotImplementedException();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var domainSetup = new AppDomainSetup()
        {
            ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
            ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,
            ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
            LoaderOptimization = LoaderOptimization.MultiDomainHost
        };

        var domain = AppDomain.CreateDomain("Your Child AppDomain", null, domainSetup);

        domain.FirstChanceException += (sender, e) =>
        { };

        Task.Factory.StartNew(() => domain.DoCallBack(() => new Runtime().Run()));

        Console.ReadKey();
    }
}

上面的示例代码似乎符合我的需求。

由于

0 个答案:

没有答案