几周前我开始在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();
}
}
上面的示例代码似乎符合我的需求。
由于