1

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

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

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

实现这一点的最简单方法是使用 ApplicationDomains 并使用带有命名管道的 .Net Remoting 进行进程间通信。我需要从你们那里知道的是,是否有任何其他方法可以使用其他工具/流程来创建这种隔离。

谢谢

更新

多看了一下,发现这个不用直接用.Net Remoting就可以轻松实现:

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

上面的示例代码似乎满足了我的需求。

谢谢

4

0 回答 0