更新09.08.2018
Unity正在开发中,但我还没有时间测试它如何与ASP.NET Core框架配合使用.
更新15.03.2018
此解决方案适用于在使用.NET Framework 4.5.2而不是 .NET Core Framework 时使用ASP.NET Core v1和Unity的特定问题.我不得不使用这个设置,因为我需要一些.Net 4.5.2 DLL,但对于任何重新开始的人我都不会推荐这种方法.此外,Unity还没有进一步开发(据我所知)所以我建议将Autofac框架用于新项目.有关如何执行此操作的详细信息,请参阅此帖子.
简介
我正在使用ASP.NET和MVC构建Web应用程序.此应用程序依赖于某些服务(WCF服务,数据存储区服务等).现在为了保持良好和解耦,我想使用DI(Dependecy Injection)框架,特别是Unity.
初步研究
我发现这篇博文,但遗憾的是它不起作用.这个想法虽然很好.
它基本上表示您不应将ServiceCollection中注册的所有服务注册到您自己的容器中,而应引用默认的ServiceProvider.
所以.如果需要解决某些问题,则调用默认的ServiceProvider,如果没有解析,则使用自定义UnityContainer解析类型.
问题
MVC总是尝试使用默认的ServiceProvider解析Controller.
此外,我注意到即使控制器得到正确解析,我也永远不会"混合"依赖关系.现在,如果我想使用我的一个服务而且还要使用ASP的IOptions接口,则该类永远无法解析,因为这两个容器中没有一个具有两种类型的解析.
我需要什么
所以回顾一下我需要以下几点:
编辑:
所以问题是如何实现这些要点?
我一直很愉快地使用Ninject现在很长一段时间,我真的很喜欢它,但我面对的,因为释放一个艰难的选择ASP.NET 5和MVC 6.
基本上,微软已经发布了自己的依赖注入系统; 据我所知,这引起了很多批评.但我更大的问题在于它如何影响其他图书馆.
从我在网上提出的另一个问题和其他资源来看,似乎Ninject不能与MVC 6一起开箱即用.尽管有一个以详细库形式给出的"解决方案" Microsoft.Framework.DependencyInjection.Ninject and Ninject.这甚至比较棘手,因为该库需要添加https://www.myget.org/F/aspnetmaster/到您的NuGet提要列表中.
我做了一些挖掘,发现这个图书馆的托管地点; 它看起来不错,它似乎可以从我能说的工作中得到解决,但有一些事情让我感到困扰.
基本上,我非常担心这是某种乐队助手,对Ninject(甚至其他容器库)的支持正在消失.是否有一些隐藏的信息,我只是没有发现?
我发现Ninject最近引入了对.NET Standard 2.0/.NET Core 2.0的支持.
但是,我找不到任何实际将其集成到Web应用程序中的扩展(例如类似于Ninject.Web.Common)
从旧的ASP.NET MVC解决方案的代码看,我意识到整个机制是不同的,因为它依赖于经典的机制,WebActivatorEx.PreApplicationStartMethod并且WebActivatorEx.ApplicationShutdownMethodAttribute在ASP.NET Core中不再可用.
此外,旧Ninject.Web.Common程序集提供了几个用于初始化的有用类--Bootstrapper,OnePerRequestHttpModule,NinjectHttpModule:
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
Bootstrapper.Initialize(CreateKernel);
}
Run Code Online (Sandbox Code Playgroud)
问题:有没有关于如何将Ninject集成到ASP.NET Core 2.0 Web应用程序中的示例?
我有一个使用 Xamarin.iOS 开发的 iOS 应用程序,它使用 Ninject 3.3.0 进行 IoC。我能够毫无问题地绑定接口和实现,但是我得到了PlatformNotSupportedException解决这些绑定的IResolutionRoot.Get<T>(). 我正在连接的 Macbook 上启动模拟器。我创建了一个测试(空白)iOS 应用程序来演示该问题。以下是相关行:
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
...
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
...
var kernel = new StandardKernel();
kernel.Bind<IFoo>().To<Foo>();
var test = kernel.Get<IFoo>(); //exception thrown here
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪的顶部(可以提供更多):
" 在 System.Reflection.Emit.DynamicMethod..ctor (System.String name, System.Type returnType, System...."
根据该站点,内核为其绑定创建了这些 DynamicMethod。既然.Net Standard 2.0支持Ninject ,为什么我会从这么简单的操作中得到这个异常?