我有以下代码:
public static IEngine CreateEngine()
{
UnityContainer container = Unity.LoadUnityContainer(DefaultStrategiesContainerName);
IEnumerable<IStrategy> strategies = container.ResolveAll<IStrategy>();
ITraderProvider provider = container.Resolve<ITraderProvider>();
return new Engine(provider, new List<IStrategy>(strategies));
}
Run Code Online (Sandbox Code Playgroud)
和配置:
<unity> <typeAliases>
<typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="weakRef" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="Strategy" type="ADTrader.Core.Contracts.IStrategy, ADTrader.Core" />
<typeAlias alias="Trader" type="ADTrader.Core.Contracts.ITraderProvider, ADTrader.Core" /> </typeAliases> <containers>
<container name="strategies">
<types>
<type type="Strategy" mapTo="ADTrader.Strategies.ThreeTurningStrategy, ADTrader.Strategies" name="1" />
<type type="Trader" mapTo="ADTrader.MbTradingProvider.MBTradingProvider, ADTrader.MbTradingProvider" />
</types>
</container> </containers></unity>
Run Code Online (Sandbox Code Playgroud)
我收到以下异常:
Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,type ="ADTrader.Core.Contracts.ITraderProvider",name ="".异常消息是:当前构建操作(构建密钥构建密钥[ADTrader.MbTradingProvider.MBTradingProvider,null])失败:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.(策略类型BuildPlanStrategy,索引3)---> Microsoft.Practices.ObjectBuilder2.BuildFailedException:当前构建操作(构建密钥构建密钥[ADTrader.MbTradingProvider.MBTradingProvider,null])失败:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.(策略类型BuildPlanStrategy,索引3)---> System.AccessViolationException:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.在MBTCOMLib.MbtComMgrClass.EnableSplash(布尔bEnable)在ADTrader.MbTradingProvider.MBTradingProvider..ctor()在BuildUp_ADTrader.MbTradingProvider.MBTradingProvider(IBuilderContext)在Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext上下文)在Microsoft.Practices.ObjectBuilder2 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)中的.BuildPlanStrategy.PreBuildUp(IBuilderContext context)--- Microsoft的Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)的内部异常堆栈跟踪结束.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator定位器,
在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称)中的Microsoft.Practices.Unity.UnityContainer.Resolve(类型t,字符串名称),位于ADTrader的Microsoft.Practices.Unity.UnityContainerBase.ResolveT. Engine.EngineFactory.CreateEngine()
任何的想法?
在我的应用程序中,我们有一个跟踪记录器.我们在跟踪方法名称和参数值的大多数重要方法的开头和结尾添加了日志语句.现在这些跟踪语句使代码膨胀,阅读它们有点痛苦.
我正在考虑如何将代码的这一方面与业务逻辑分开.
今天我读到了Unity的拦截框架.如果可以使用通用记录器拦截我的方法调用并记录方法名称和参数值,我有一个想法.我不确定是否可以使用反射读取方法参数.Unity可以像这样使用吗?
另一个想法是运行T4代码生成引擎,在用特定属性修饰的所有方法的开头和结尾生成日志记录语句.由于我对T4知之甚少,有谁知道这是否可以实现?
有没有其他方法可以将日志记录代码与业务逻辑分开?
干杯,Unmesh
我正在尝试使用ParameterOverrideUnity 2.0.只要我提供的参数不是System.Type,它就可以正常工作.
在下面的测试程序中,MyClass<T>当泛型参数T是int时,我使用整数参数注入构造函数,当T是System.Type时,我使用Type参数.在随后的输出中,您将看到它处理整数就好了,但似乎认为这typeof(MyClassForParam)是一个实际的MyClassForParam对象,而不是类型.有任何想法吗?
namespace UnityParameterOverride
{
interface IMyClass
{
}
public class MyClass<T> : IMyClass
{
public MyClass(T myParam)
{
Console.WriteLine("{0}", myParam);
}
}
public class MyClassForParam
{
public MyClassForParam() { }
}
class Program
{
static void Main(string[] args)
{
IUnityContainer unity = new UnityContainer();
try
{
// Works fine: prints 12345
Console.WriteLine("Injecting an integer parameter.");
unity.RegisterType<IMyClass, MyClass<int>>();
unity.Resolve<IMyClass>(new ParameterOverride("myParam", 12345));
// Fails: Seems to think that the parameter is an …Run Code Online (Sandbox Code Playgroud) 我有一个自定义剃刀视图基类,它具有本地化相关服务的属性,通过属性注入与Unity注入.
如果我在视图中使用该属性,则属性已正确解析.但是,如果我尝试在布局(母版页)中使用相同的属性,那么尚未设置属性.
有人可以解释在Unity尝试解析视图并注入依赖关系之前如何呈现和编译视图.
我试图用公约[ViewName.Title]设置每个视图的标题和有,这对观的伟大工程的本地化服务查找,但我不想重复它在每一个视图.我有一种感觉将逻辑移到_ViewStart.cshtml但ViewBag或我的本地化服务在那里不可用.
基类:
public abstract class LocalizeBaseWebViewPage<TModel> : WebViewPage<TModel>
{
[Microsoft.Practices.Unity.Dependency]
public ILocalizationService LocalizationService { get; set; }
public virtual string Localize(string key)
{
return LocalizationService.GetResource(key);
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于Index.cshtml
@{
ViewBag.Title = Localize("Title");
Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
但不是在_Layout.cshtml中,因为没有为服务设置对象引用.
@{
ViewBag.Title = Localize("Title");
}
Run Code Online (Sandbox Code Playgroud) 我正在将Unity配置移动到web.config文件.我坚持如何将以下代码配置迁移到xml格式:
var container = new UnityContainer();
container.RegisterType<IPrincipal>(new InjectionFactory(x=> HttpContext.Current.User));
return container;
Run Code Online (Sandbox Code Playgroud)
以下是XML声明:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IRepository" type="Model.IRepository, Model" />
<alias alias="Repository" type="Data.Repository, Data" />
<container>
<register type="IRepository" mapTo="Repository" />
</container>
</unity>
Run Code Online (Sandbox Code Playgroud) .net c# inversion-of-control unity-container service-locator
参考此CodePlex统一文章,我能够使用WebAPI控制器获取过滤器属性,如下所示:
[MyFilterAttribute]
public class TestController : ApiController
{}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想在使用GlobalConfiguration的所有操作中应用我的filter属性,它将被剥离注入的依赖项:
public class MyFilterAttribute : ActionFilterAttribute
{
[Dependency]
public MyDependency { get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (this.MyDependency == null) //ALWAYS NULL ON GLOBAL CONFIGURATIONS
throw new Exception();
}
}
public static class UnityWebApiActivator
{
public static void Start()
{
var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());
GlobalConfiguration.Configuration.DependencyResolver = resolver;
GlobalConfiguration.Configuration.Filters.Add(new MyFilterAttribute());
RegisterFilterProviders();
}
private static void RegisterFilterProviders()
{
var providers =
GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
GlobalConfiguration.Configuration.Services.Add(
typeof(System.Web.Http.Filters.IFilterProvider),
new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));
var …Run Code Online (Sandbox Code Playgroud) 我试图通过使用Unity将基于接口的两个对象注入到类构造函数中.
单元测试时我当前收到以下错误:
结果消息:
测试方法TestProject.TFStests.Check_Interface_CheckOut_Method引发异常:System.InvalidOperationException:类型Adp.Tools.VersionControl.TfsVersionControl.TfsVcPromotionManager没有带参数的构造函数(TfsVcQaCheckoutWorker).
以下代码是我的Unity类,用于注册和解析TfsVCPromotionManager对象:
public class UnityClass
{
public static ITfsVcPromotionManager returnNewPromotionManager(
VersionControlServer tfServer)
{
var container = new UnityContainer();
ITfsVcQaCheckinWorker test1 = CreateUnityCheckInWorker();
ITfsVcQaCheckoutWorker test2 = CreateUnityCheckOutWorker(tfServer);
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2), new InjectionConstructor(test1));
return container.Resolve<TfsVcPromotionManager>();
}
private static ITfsVcQaCheckinWorker CreateUnityCheckInWorker()
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckinWorker, ITfsVcQaCheckinWorker>();
return container.Resolve<TfsVcQaCheckinWorker>();
}
private static ITfsVcQaCheckoutWorker CreateUnityCheckOutWorker(
VersionControlServer passedServer)
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckoutWorker, TfsVcQaCheckoutWorker>(
new InjectionConstructor(passedServer));
return container.Resolve<TfsVcQaCheckoutWorker>();
}
}
Run Code Online (Sandbox Code Playgroud)
这是TfsVcPromotionManager班上的顾问.请注意,它清楚地基于接口的实例需要ITfsVcQaCheckoutworker和 …
c# integration-testing constructor exception unity-container
TFS 2013 - Build:ASP.Net 4.5.1网站我收到此错误:
warning MSB3268: The primary reference "C:\Builds\2\MyProj\Web1_Main\bin\MyProj1.dll"
could not be resolved because it has an indirect dependency on the framework assembly
"System.Runtime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which
could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.5.1". To resolve this problem, either remove the reference
"C:\Builds\2\MyProj\Web1_Main\bin\MyProj1.dll" or retarget your application to a framework
version which contains "System.Runtime, Version=4.0.10.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a".
Run Code Online (Sandbox Code Playgroud)
最初使用Unity 1.0.0.0的所有项目和站点都是4.0.我将其升级到4.5.2.此外,上述错误中的MyProj1引用了Unity,我也将其升级到3.5.1.
阅读本文:https://unity.codeplex.com/workitem/12756 构建服务器已在变通方法中指向更新的4.5.2.
所以我降级到4.5.1,但仍然得到错误.
解决方案通过Visual Studio 2013在本地构建良好.
该独立的类库项目建设TFS正常,但当的Myproj被添加到我的网站的参考,当它失败的.
有任何想法吗?
在升级时,我是否需要除TragetFramework settign之外的任何web.config更改?
我正在寻找使用PRISM创建我的第一个应用程序,我下载了它(V5),我已经准备好了,但仍然有些事情让我烦恼.
团结或MEF.
如果我选择一个与另一个相比,有什么我不能做的事情吗?
我的意思是,我检查了PRISM提供的两个快速入门示例,在我看来这只是一个品味问题.
我通过互联网搜索,大多数页面都说Unity不能发现模块等,但是(据我所知),在Prism应用程序的情况下,Prism为Unity做了这个.
所以我的最后一个问题是: - 选择Unity或MEF只是一个"品味"的问题,还是真的有某些东西(限制,功能,易用性)应该让我选择其中一个?
非常感谢你
所以MS掉线(免费获得)Unity.Unity
的未来 github存储库在GitHub上显示为非活动Unity
有人知道Unity发生了什么事吗?
如果Unity是dotnet核心下的死胡同,是否有针对dotNet Core的IOC依赖注入工具?
编辑:仍在等待关于Unity的新闻.
搜索的替代方案:StructureMap , AutoFac
或我们的选择,SimpleInjector 它在GitHub上非常活跃.每天有很多下载已经从Nuget单独下载了大约1亿.它的快速,非常好的文档,一个很好的API,具有良好的可扩展性. Microsoft.Extensions.DependencyInjection将是下一个选择.我们没有ASP.NET项目,如果你这样做,那么一定要看MS DI.您也可以在DotNet Core中使用MS DI,
我更喜欢SimpleInjector.该文档非常好,每天下载量超过500次,总计超过100万次,Simpleinjector已超过临界质量.
EDIT2: Unity可能会为.netcore做一个凤凰.它还在踢.
请参阅Unity for github上的Unity for .netStandard讨论.虽然还没有很多活动.至少有一些支持让它在Core上运行.问题是它太晚了吗?晚期移民可能仍然受益.就目前而言(2018年),它看起来仍然需要替代方案.
SimpleInjector正在取得可靠的进展作为合法的替代品.
请参见SimpleInjector Nuget页面.下载量近300万,每天> 1k.截至2018年6月.