我有.net类我使用unity作为IOC来解析我们的依赖项.它尝试在开头加载所有依赖项.Unity中有一种方法(设置)允许在运行时加载依赖项吗?
有没有办法让我的DI容器中注册的所有对象的列表.ResolveAll给出了一个类型的列表,但我想要一个所有类型的通用列表
注1:我想说清楚:我不是试图延迟加载依赖项或注入延迟类型.
大多数(所有?)IoC容器都需要在容器中注册元数据,以描述在询问时应如何解析某些类型; 这包括接口的实现,对象的生命周期等.在过去几年中,基于流畅/约定的API已被添加到大多数(所有?)IoC容器中,这在提供此功能时减少了大量噪音元数据到容器.
使用ninject,我使用基于约定的方法来注册我的元数据,但我是按需提供,而不是预先.这样可以在集成测试场景中节省大量性能,您可以在其中创建~10个对象; 您将失去每次测试都必须注册整个应用程序依赖项的开销.
注意2:请不要告诉我不要在集成测试中使用IoC容器.
在可用时转向使用Microsoft组件存在一些压力,因此Unity正在我的视野中.我有基于约定的注册工作,但我无法弄清楚如何在Ninject中按需/懒惰地"发现"这个元数据.
我第一次尝试实现这个是在UnityContainer实例周围使用包装器,并在包装器上调用GetInstance(type)后,我可以查询容器以查看该类型是否已注册.如果没有,我可以调用我的约定,发现元数据,并注册类型.然而,这种方法只有一个层次; 如果该类型注入了更多依赖项,则每个依赖项都不会被反馈到GetInstance(type)方法中,因此,我的困境.
问题:我如何懒惰/按需添加类型注册到Unity?
Source会很好,但是指向容器中钩子的指针也同样好.我尝试了继承,但没有像Ninject那样覆盖.
.net dependency-injection ninject ioc-container unity-container
根据我的理解,棱镜的统一容器可以解决类型事件,如果它们尚未注册,这是否使_container.RegisterType有点无用?
谢谢!
我正在使用Unity IoC(Microsoft.Practices.Unity),我可以正常编译,但是我在运行时遇到以下错误:
Could not load type 'System.Reflection.IntrospectionExtensions' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Run Code Online (Sandbox Code Playgroud)
Unity版本是:3.0.1026.0
.Net 4和此版本的Unity之间是否存在兼容性问题.此外,使用Unity v2时出现相同的错误.如果是这样,我该如何解决这个问题呢?
编辑: 另外,我已经验证我的项目中引用了mscorlib.
目前我正在学习更多关于caliburn.micro的内容,这真是令人惊叹.
在我的小型演示项目中,有一些导航,有MEF和EventAggregator.
由于我想在一个已经使用统一的项目中使用caliburn.micro,我想使用Unity进行DI.
如何设置引导程序以使用Unity?
除了MindScape教程和codeplex页面上的任何好的教程都非常受欢迎.(除了我没有看到处理这种情况的合适的人)
我有一个dot.NET 4.0 Web应用程序,其中定义了自定义部分:
<configuration>
<configSections>
<section name="registrations" type="System.Configuration.IgnoreSectionHandler, System.Configuration, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="true" restartOnExternalChanges="true" allowLocation="true"/>
....
Run Code Online (Sandbox Code Playgroud)
在web.config文件的末尾我有相应的部分:
....
<registrations>
.....
</registrations>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我每次打电话System.Configuration.ConfigurationManager.GetSection("registrations");都会得到以下异常:
为注册创建配置节处理程序时发生错误:给定的程序集名称或代码库无效.(来自HRESULT的异常:0x80131047)(C:\ ...\web.config第13行)
我也在使用Unity,但不知道这是否与错误有关.
你以前遇到过这个错误吗?我该如何解决?我是否需要更换IgnoreSectionHandler其他东西?
我的情景看起来(对我来说)很直接,但我找不到解决方案.
我有这种情况
public class Class<T> : IInterface where T : class
{
}
Run Code Online (Sandbox Code Playgroud)
接口不能通用(来自WCF lib.)
所以我想注册这样的界面
container.RegisterType(typeof (IInterface ), typeof (Class<>));
Run Code Online (Sandbox Code Playgroud)
然后用T解决它
我该怎么做?我错过了什么?
我的意图是做类似的事情
container.Resolve<IInterface>(/* specify T */);
Run Code Online (Sandbox Code Playgroud) 我想知道如何在UnityContainer中实现这样的功能:
container.RegisterType<IDummy>(Func<IDummy>) // deferred resolution
Run Code Online (Sandbox Code Playgroud) 下面的代码开始
public interface IDataContextAsync : IDataContext
{
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
Task<int> SaveChangesAsync();
}
public partial class DB1Context : DataContext{ }
public partial class DB2Context : DataContext{ }
Run Code Online (Sandbox Code Playgroud)
以下是UnityConfig文件。注意:我正在为ASP.Net MVC使用Nuget引导程序,以下是我的UnityConfig文件
public static void RegisterTypes(IUnityContainer container)
{
container
.RegisterType<IDataContextAsync, DB1Context>("DB1Context", new PerRequestLifetimeManager())
//.RegisterType<IDataContextAsync, DB2Context>("DB2Context", new PerRequestLifetimeManager())
.RegisterType<IRepositoryProvider, RepositoryProvider>(
new PerRequestLifetimeManager(),
new InjectionConstructor(new object[] {new RepositoryFactories()})
)
.
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
而且我得到以下错误:
当前类型Repository.Pattern.DataContext.IDataContextAsync是一个接口,无法构造。您是否缺少类型映射?
了解该命名实例不适用于我的UnityConfig。有想法吗?
提前致谢
unity-container ×10
c# ×6
.net ×4
wpf ×2
.net-4.0 ×1
asp.net ×1
asp.net-mvc ×1
c#-4.0 ×1
generics ×1
lambda ×1
ninject ×1
prism ×1
web-config ×1