有没有办法让Unity将属性注入的对象作为拆解的一部分进行处理?
背景是我正在使用ASP.NET MVC 2,Unity和WCF的应用程序.我们编写了自己的MVC控制器工厂,它使用unity实例化控制器,并使用控制器公共属性的[Dependency]属性注入WCF代理.在页面生命周期结束时,调用控制器工厂的ReleaseController方法,并调用IUnityContainer.Teardown(theMvcController).此时控制器按预期处理,但我还需要处理注入的wcf代理.(实际上我需要对它们调用Close和/或Abort而不是Dispose但这是后来的问题.)
我当然可以覆盖控制器的Dispose方法并清理那里的代理,但我不希望控制器必须知道注入接口的生命周期,甚至是它们引用WCF代理.
如果我需要自己编写代码 - 什么是最好的扩展点?我很欣赏任何指针.
在一个新的WPF项目(VS2010)中,我第一次使用Unity 2.在这个项目中,我使用以下结构:
解
WPF项目
类库1
班级图书馆2
班级图书馆3 ....
使用Unity注册不同类型是在WPF Project中使用以下代码段完成的:
IUnityContainer container = new UnityContainer()
.RegisterType<IObjectContext, ObjectContextAdapter>()
.RegisterType<IConnectionStringProvider, ConnectionStringProvider>()
.RegisterType(typeof(IRepository<>), typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)
现在让我说我想<Orders在类库1中解析Repository > constructor-inject.显然,容器在其他项目中并不为人所知!
我该怎么做?
那里有没有好的UnityContainerExtension例子/教程?
请不要参考Unity Event Broker示例.
这更像是一个评论而不是一个问题,尽管反馈会很好.我的任务是为我们正在做的新项目创建用户界面.我们想使用WPF,我想学习所有现代UI设计技术.由于我是WPF的新手,我一直在研究可用的东西.我想我已经基本上决定使用MVVM Light Toolkit(主要是因为它的"可混合性"和EventToCommand行为!),但我也希望合并IoC.所以,这就是我想出的.我修改了MVVM Light项目中的默认ViewModelLocator类,以使用UnityContainer来处理依赖注入.考虑到我不知道这些术语的90%在3个月前是什么意思,我认为我走在了正确的轨道上.
// Example of MVVM Light Toolkit ViewModelLocator class that implements Microsoft
// Unity 2.0 Inversion of Control container to resolve ViewModel dependencies.
using Microsoft.Practices.Unity;
namespace MVVMLightUnityExample
{
public class ViewModelLocator
{
public static UnityContainer Container { get; set; }
#region Constructors
static ViewModelLocator()
{
if (Container == null)
{
Container = new UnityContainer();
// register all dependencies required by view models
Container
.RegisterType<IDialogService, ModalDialogService>(new ContainerControlledLifetimeManager())
.RegisterType<ILoggerService, LogFileService>(new ContainerControlledLifetimeManager())
;
}
}
/// <summary>
/// Initializes a …Run Code Online (Sandbox Code Playgroud) 我看到几个与此有关的问题,但我仍然无法找到我正在寻找的答案,所以我发布了我的问题.如果另一个问题得到答案(我只是没有看到),请指出我.
我正在试图找出我的UnitOfWork所属的位置 - 特别是,在使用EF4和Unity与Repository模式时创建.
基本上,我有一个用于实现我的业务逻辑的服务.此服务构造函数接收存储库,因此服务将注入我的存储库.然后,该服务使用注入的存储库对数据存储执行操作 - 但我需要将它们包含在一个工作单元中.
但是,我的工作单元需要注入EF4上下文(或者,在我的情况下,和上下文的接口 - IObjectContext).而且我不确定UoW应该在哪里创建并注入上下文.
以下是我能想到的可能选项,其中没有一个看起来很理想:
在服务构造函数中包含UoW,从而使用工作单元注入服务,然后使用我的EF4上下文注入.但这似乎是错误的,因为我不想在存储库的每个实例上创建我的UoW.
使用container.Resolve进行按需创建以获取UoW的实例,注入我的EF4上下文.这似乎过于不得不经常点击IoC容器,而不是已经有权访问UoW.
将上下文直接注入服务,允许我创建UoW(上下文).这看起来很糟糕,因为我现在已经将上下文暴露给服务,这应该被隔离到存储库.
所以我的问题是,这些方法中的一种是可以接受的,还是有其他方法我没想到?
提前致谢.
entity-framework repository ioc-container unity-container unit-of-work
我在控制器中遇到了这个问题:
尝试创建类型为' * .WebMvc.Controllers.HomeController' 的控制器时发生错误.确保控制器具有无参数的公共构造函数.
找到ApiController的解决方案,但没有找到任何关于普通Controller的信息.
从头开始创建新的MVC 4项目.
HomeController.cs:
public class HomeController : Controller
{
private IAccountingUow _uow;
public HomeController(IAccountingUow uow)
{
_uow = uow;
}
Run Code Online (Sandbox Code Playgroud)
UnityDependencyResoler.cs:
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
RegisterTypes();
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}catch
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}catch
{
return null;
}
}
private void RegisterTypes()
{
_container.RegisterType<IAccountingUow, …Run Code Online (Sandbox Code Playgroud) 有没有办法在C#unity中如何使用属性拦截并将对象注册代码保存在XML文件中(如app.config)?如果是的话,你能为我提供代码,这样的注册应该怎么样?我做了很多解决方法,但没有找到解决此问题的方法.
我正在构建一个控制台应用程序,以便控制反转.我试图从nuget包管理器下载"Unity"IoC容器,但是遇到了这个错误.任何帮助都很有用.我正在使用visual studio 2010 pro.

Unity允许您命名同一接口的不同实现,然后按名称解析它们:
var container = new UnityContainer();
// register
container.Register<IFish, OneFish>("One");
container.Register<IFish, TwoFish>("Two");
// resolve
var twoFish = container.Resolve("Two");
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个依赖于IFish并实现ITank的类:
class Tank : ITank
{
public Tank(IFish fish) {...}
}
Run Code Online (Sandbox Code Playgroud)
我如何解决ITank并指定要获得哪些IFish实现?
这不起作用:
container.Register<ITank, Tank>();
var tank = container.Resolve<ITank>("One");
Run Code Online (Sandbox Code Playgroud)
这有效:
var fish = container.Resolve<IFish>("One");
var tank = container.Resolve<Tank>(new DependencyOverride(typeof(IFish), fish);
Run Code Online (Sandbox Code Playgroud)
但它只处理简单的情况(例如在这个例子中)而不是可能有许多名为"One"的实现的一般情况.我想要的是能够告诉Unity:
"当解析名为"One"的使用实现时,如果没有这样的实现,则寄存器将回退到未命名的实现"
是否有可以通过此行为插入Unity的自定义解析程序?
我在Unity文档中看到的示例让您通过new LifetimeManager()内联指定生命周期管理器.所以我有这个代码:
container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new PerRequestLifetimeManager(),
new InjectionConstructor(typeof (ApplicationDbContext)));
container.RegisterType<UserManager<ApplicationUser>>(new PerRequestLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
很好,但我想知道为什么我要创建这么多实例.我有什么理由不这样写吗?
var lifetimeManager = new PerRequestLifetimeManager();
container.RegisterType<ApplicationDbContext>(lifetimeManager);
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(lifetimeManager,
new InjectionConstructor(typeof (ApplicationDbContext)));
container.RegisterType<UserManager<ApplicationUser>>(lifetimeManager);
Run Code Online (Sandbox Code Playgroud)
这看起来很明显但是通过PDF阅读所有的例子都是前一种风格而没有评论,所以我想知道我是否不理解它是如何工作的.
unity-container ×10
c# ×5
.net ×1
idisposable ×1
interception ×1
mvvm-light ×1
nuget ×1
repository ×1
unit-of-work ×1
wcf-proxy ×1
wpf ×1