我正在尝试使用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) 我注册了这样的统一容器:
var container = new UnityContainer();
container.RegisterType<ICacheManager, CacheManager>(new ContainerControlledLifetimeManager())
Run Code Online (Sandbox Code Playgroud)
是否可以从控制器访问此"容器"
简而言之,我试图将Castle Windsor容器与Unity容器联系起来.让我解释一下背景:
我有一个项目,很长一段时间它使用城堡windsor.几天前,我得到了一些我必须从我的旧项目中消耗/使用的dll.这些DLL使用Unity Container作为其注入机制.我也可以访问这些dll中的接口/实现,但我不会尝试实例化手动实现,但我更愿意,如果可能的话,将Unity容器与我当前的城堡windsor容器相关联.我怎么能实现这个目标?
所以,如果我有:
public class MyService: IService
{
public MyService (IThidPartyService thirdParty)
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我IService和windsor IThirdPartyService一起解决,那么另一个容器要解决它会很好:Unity.
谢谢!.
是否有任何与Unity中的StructureMap的Registry类相同的东西?
我喜欢考虑一个层/组件/库来自我配置 - 从而填充容器.所以"父"层只需要知道注册类.
我已经习惯了Ninject,对于一个特定的项目,我被要求学习Unity.
有一件事我无法找到有关如何做的信息.
在Ninject我可以说:
Bind<IWarrior>().To<Samurai>().Named("Samurai");
Bind<IWarrior>().To<Ninja>().Named("Ninja");
Bind<IWeapon>().To<Katana>().WhenInjectedInto(typeof(Samurai));
Bind<IWeapon>().To<Shuriken>().WhenInjectedInto(typeof(Ninja));
Run Code Online (Sandbox Code Playgroud)
然后,当一个人要求武士名为武士时,武士带有卡纳纳,忍者带有手里剑.正如它应该.
我不想在战士中引用容器以获得适当的武器,并且不希望用属性污染模型(在另一个没有引用ninject或统一的程序集中)
PD:我正在寻找一种代码方式,而不是通过xml配置.
我们已经设置了一个WCF服务,该服务使用Unity容器来解析用于管理Exchange 2010 Powershell命令的实例.我们定义了一个IExchangePowershell接口,它有一个实现IDisposable的具体实现.一段时间后,我们遇到了无法执行powershell命令的问题,因为服务器说已经有太多的PowerShell会话打开了.似乎我们从未真正处理过我们的powershell实例.具体的Powershell的Dispose()方法将负责关闭运行空间和会话.一旦我在存储库方法中调用它,我们就不会再出现错误了.
((IDisposable)this.powershell).Dispose();
Run Code Online (Sandbox Code Playgroud)
现在我当然不希望在每个存储库方法中显式调用dispose.我认为团结可以解决这个问题.我们的WCF实例提供程序执行此操作:
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
container.Teardown(instance);
}
Run Code Online (Sandbox Code Playgroud)
但这并没有真正处理IExchangePowershell实例.你知道如何自动处理这些实例吗?
例如,我将"当前用户"存储在Session中.业务层对象由Unity实例化.如何让业务层对象知道"当前用户"?
asp.net-mvc dependency-injection unity-container asp.net-mvc-4
这是一个我几个小时都在苦苦挣扎的难题.这是背景:
Unity IoC在MVC4网络应用程序中使用ApiControllers (IHttpController)和一堆常规控制器(IController)IControllers很好IHttpControllers已经运行了好几个月,现在因类型解析错误而失败,其中包含详细信息" The type InjectionPolicy cannot be constructed. You must configure the container to supply this value"ICustomerService依赖关系的依赖关系,该ICustomerRepository依赖关系又具有IClient依赖关系,但这些依赖关系都不是新的或不同的.ICustomerService从ApiController解决问题中删除依赖性(但该接口已明确配置并在其他地方工作)HttpControllerActivatorUnity中注册并拦截了解决IHttpControllers它的调用- 它在容器上失败.解析,即使查看容器,控制器显然也在那里.我搜索了这个特定的错误并没有找到任何结果.有没有人见过它或它是否给你任何关于可能发生的事情的线索?
非常感谢!
更新:我已将其缩小到ICustomerRepository分辨率(再次,在所有其他流程中工作).错误是:
Resolving Xxx.CustomerRepository,(none) (mapped from Xxx.ICustomerRepository, (none))
Resolving Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior,(none)
Resolving parameter "policies" of constructor Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior(Microsoft.Practices.Unity.InterceptionExtension.CurrentInterceptionRequest interceptionRequest, Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy[] policies, Microsoft.Practices.Unity.IUnityContainer container)
Resolving Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy[],(none)
Run Code Online (Sandbox Code Playgroud) ioc-container inversion-of-control unity-container asp.net-mvc-4
我正在使用ASP.Net MVC 4,EF和Unity for DI.还使用UnitOfWork模式.试图找出实现这一目标的最佳方法.我有如下代码.我遇到的问题是Business和Repository层中的Dispose()现在永远不会被调用,只有两个中的Destructor被调用,所以对象似乎永远不会被处理掉.请回答以下问题
我是否真的需要Business和Repository层中的IDisposable实现(如果Unity已经在处理它)
我应该怎么做才能调用Dispose()(我应该将它添加到Controller中还是Dispose所有其他对象或使用某些特定的LifeTime管理器)
我是否应该使用每个的Singleton实例,或者将它放在每个请求中,就像它在Web环境中一样.
的Global.asax.cs:
private static IUnityContainer _unityContainer;
protected void Application_Start()
{
_unityContainer = UnityBootstrapper.SetupUnity();
_unityContainer.RegisterType<IController, ProductController>("Product");
DependencyResolver.SetResolver(new Microsoft.Practices.Unity.Mvc.UnityDependencyResolver(_unityContainer));
}
Run Code Online (Sandbox Code Playgroud)
UnityBootstrapper.cs:
public class UnityBootstrapper
{
public static IUnityContainer SetupUnity()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IProductDbContext, ProductDbContext>()
.RegisterType<IUnitOfWork, UnitofWork>(new InjectionConstructor(new ResolvedParameter(typeof(IProductDbContext))))
.RegisterType<IProductRepository, ProductRepository>()
.RegisterType<IProductBusiness, ProductBusiness>();
}
}
Run Code Online (Sandbox Code Playgroud)
ProductController.cs:
public class ProductController : ControllerBase
{
private readonly IProductBusiness _productBusiness;
public ProductController(IProductBusiness productBusiness)
{
_productBusiness = productBusiness;
}
//No Dispose for this
}
Run Code Online (Sandbox Code Playgroud)
ProductBusiness.cs:
public class ProductBusiness …Run Code Online (Sandbox Code Playgroud) c# dependency-injection idisposable unity-container asp.net-mvc-4
unity-container ×10
c# ×5
idisposable ×2
.net ×1
asp.net-mvc ×1
autofac ×1
factory ×1
ninject ×1
wcf ×1