我有几个 Rebus 新手入门问题。Rebus ReadMe 文件中所有不错的示例都使用了 Windsor Castle,但我没有那个选项;相反,我必须使用 Unity。
我的第一个挑战是为 Unity IoC Container 找到合适的适配器,如示例所述:
var someContainerAdapter =
new AdapterForMyFavoriteIocContainer(myFavoriteIocContainer);
Run Code Online (Sandbox Code Playgroud)
我终于在这里找到了一些似乎可以完成这项工作的代码,但也许存在更好的容器,因为我必须自己实现IContainerAdapter接口(我想知道是否需要......)。
但我可以忍受...
我的下一个问题更糟,我还没有发现。在 Rebus 入门示例中,以下内容用于向 IoC 容器添加处理程序:
container.Register(
Component.For<IHandleMessages<DateTime>>()
.ImplementedBy<PrintDateTime>());
Run Code Online (Sandbox Code Playgroud)
以上是 Windsor Castle 语法,我不知道 Unity 语法应该如何用于相同的操作。所以我需要一些帮助。一个建议是,如果我能得到一个适用于 Unity 的小型解决方案的参考。
当前的应用程序是由其他开发人员使用Unity的Dependency Injection开发的.该应用程序是在MVC4和实体框架中开发的.这个应用程序不大,甚至不是中型应用程序.
现在,团队希望删除依赖注入,因为它消耗了大量内存.
我的问题是
1)依赖注入是否真的消耗了大量内存?
2)具有依赖注入的优点?
3)拥有Unity,依赖注入的目的是什么?
4)如何从应用程序中删除此依赖注入?
谢谢
我正在使用Visual Studio Enterprise 2015并尝试创建层图以生成和验证依赖项.但这失败了,因为VS在构建建模项目时抛出警告:
CurrentVersion.targets(1819,5):警告MSB3268:无法解析主要引用"...\ClassLibrary4\bin\Debug\ClassLibrary4.dll",因为它对框架程序集"System.Runtime,Version"具有间接依赖性= 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"无法在当前目标框架中解析." .NETFramework,版本= V4.0" .要解决此问题,请删除引用"...\ClassLibrary4\bin\Debug\ClassLibrary4.dll"或将应用程序重新定位到包含"System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken"的框架版本= b03f5f7f11d50a3a".
我发现如果删除Unity,警告就会消失,并且依赖关系会按预期显示.
这种行为的原因是什么,有没有解决方法?
我尝试了Unity预发行包以及另一个目标框架.完全没有效果.在添加建模项目并在一个引用项目中使用unity之后,可以使用新项目重现该问题.
我正在按照本网站上描述的程序设置一个 Unity Dependency Resolver,以便将依赖注入到我的一个控制器中。这段代码工作正常:
var container = new UnityContainer();
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
上面的代码放在WebApiConfigRegister(HttpConfiguration config)方法中。但是,说明还指定您必须使用以下代码:
config.DependencyResolver = new DependencyResolver();
Run Code Online (Sandbox Code Playgroud)
这就是问题所在:DependencyResolver() 在当前上下文中不存在。我试过搜索这个,我也试过 UnityDependencyResolver() ,它也不存在。我正在使用(或尝试使用)命名空间:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using Microsoft.Owin.Security.OAuth;
using Microsoft.Practices.Unity;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using URLShortener.Models;
using Microsoft.Practices.Unity;
using System.Web.Http.Dependencies;
Run Code Online (Sandbox Code Playgroud)
DependencyResolver 似乎不再存在,这让我感到困惑。谢谢你。
c# dependency-injection unity-container unit-of-work asp.net-web-api
我正在使用存储库和服务层设计模式构建 ASP.NET MVC 5 应用程序。我已经使用 unity 将我的服务注入到我的控制器中。
这工作得很好,直到现在我还不需要考虑实例化任何需要在控制器外部注入接口的对象。但是,在配置应用程序启动以在数据库中设置一些用户时,我需要这样做。
为此,我想使用我UsersService构建的。我想到,随着应用程序的增长,肯定会在其他情况下我想做同样的事情,例如从另一个服务中调用一个服务。
我发现我可以实例化一个 Unity 容器并调用它的解析来获取我的新服务实例:
IProductService productService = container.Resolve<IProductService>();
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说有点难闻,让容器泄漏到我的应用程序中似乎是一种反模式。那么有没有更好的方法来做到这一点呢?
asp.net-mvc dependency-injection unity-container asp.net-mvc-5
我目前正在尝试在装饰器中包装一个类,并在运行时注入其中一个依赖项。我目前有一个由 a和 aIStorage实现的接口。接受a和Context` 对象。然而,每次解析这些类时都需要传入上下文对象。StorageCacheDecoratorStorageStorageCacheDecoratorIStorageStorage object takes in a
public interface IStorage
{
}
public class Storage : IStorage
{
public Context Context { get; }
public Storage(Context context)
{
this.Context = context;
}
}
public class StorageCacheDecorator : IStorage
{
public IStorage InnerStorage { get; }
public StorageCacheDecorator(IStorage innerStorage)
{
this.InnerStorage = innerStorage;
}
}
public class Context
{
}
Run Code Online (Sandbox Code Playgroud)
我省略了实现细节,下面的测试给出了我的问题的示例
[Test]
public void ShouldResolveWithCorrectContext()
{
var context = new Context();
var …Run Code Online (Sandbox Code Playgroud) 我有一个统一配置文件(App.config)如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IProductService" type="UnityExample.Service.IProductService, UnityExample.Service" />
<containers>
<container name="Service">
<register type="IProductService" mapTo="ProductService"/>
</container>
</containers>
</unity>
</configuration>
Run Code Online (Sandbox Code Playgroud)
现在我想从上面加载配置file。
var container = new UnityContainer().LoadConfiguration("Service");
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
[ArgumentNullException:值不能为空。参数名称:section] Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer容器,UnityConfigurationSection部分,String containerName)
我有一个包含许多项目和内部 NuGet 包的巨大解决方案,它们普遍依赖于 Unity 4.0.1。我们正在评估将此解决方案迁移到 Unity 5.11.1 以提高性能并解决由 Unity 项目在 5.0.0 版本中彻底删除的代码引起的随机 DI 相关崩溃。
在寻找一种简化从外到内迁移的方法时,已经开发了两种工具:
这两种工具都很好地通过了他们的单元测试,并且转换器设法转换了一个关键的“叶”项目,但是,当我们尝试从一个内部项目引用迁移的叶项目时遇到了障碍:臭名昭著的NU1605。
我绝对可以看到 NU106 错误是如何保证的,因为内部项目仍然引用 Unity 4.0.1,而叶项目引用 Unity 5.11.1。然而,这是工具妨碍我们的一种情况:我需要两个版本“共存”,因为我正在手动弥合它们的不一致。
从理论上讲,这应该是可行的,因为 DLL 具有不同的版本,甚至命名空间也不同。
有什么办法可以“强制”nuget 接受这个奇怪的设置?
我们有一个旧代码
public override void PreBuildUp(IBuilderContext context)
{
var type = context.OriginalBuildKey.Type;
Run Code Online (Sandbox Code Playgroud)
现在必须是
public override void PreBuildUp(ref BuilderContext context)
{
Run Code Online (Sandbox Code Playgroud)
与现在类型OriginalBuildKey中的属性对应的是什么?我想不通。contextBuilderContext
我正在考虑使用Prism在Silverlight 3中做一个项目,我非常喜欢这里显示的事件聚合http://development-guides.silverbaylabs.org/Video/Prism-Eventing
所有的资源似乎都指向使用Unity with Prism而不是Ninject.在Ninject中是否有类似的聚合事件的方式?或者,如果我想使用Prism,我只限于Unity吗?
unity-container ×10
c# ×6
.net ×2
asp.net-mvc ×1
ninject ×1
nuget ×1
prism ×1
rebus ×1
servicebus ×1
silverlight ×1
unit-of-work ×1