标签: unity-container

统一处置对象

有没有办法让Unity将属性注入的对象作为拆解的一部分进行处理?

背景是我正在使用ASP.NET MVC 2,Unity和WCF的应用程序.我们编写了自己的MVC控制器工厂,它使用unity实例化控制器,并使用控制器公共属性的[Dependency]属性注入WCF代理.在页面生命周期结束时,调用控制器工厂的ReleaseController方法,并调用IUnityContainer.Teardown(theMvcController).此时控制器按预期处理,但我还需要处理注入的wcf代理.(实际上我需要对它们调用Close和/或Abort而不是Dispose但这是后来的问题.)

我当然可以覆盖控制器的Dispose方法并清理那里的代理,但我不希望控制器必须知道注入接口的生命周期,甚至是它们引用WCF代理.

如果我需要自己编写代码 - 什么是最好的扩展点?我很欣赏任何指针.

idisposable ioc-container unity-container wcf-proxy

7
推荐指数
1
解决办法
4391
查看次数

如何在mutli-project解决方案中使用Unity进行解析

在一个新的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.显然,容器在其他项目中并不为人所知!

我该怎么做?

inversion-of-control unity-container

7
推荐指数
1
解决办法
5686
查看次数

UnityContainerExtension示例

那里有没有好的UnityContainerExtension例子/教程?

请不要参考Unity Event Broker示例.

.net unity-container

7
推荐指数
1
解决办法
5869
查看次数

结合MVVM Light Toolkit和Unity 2.0

这更像是一个评论而不是一个问题,尽管反馈会很好.我的任务是为我们正在做的新项目创建用户界面.我们想使用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)

wpf ioc-container unity-container mvvm-light

7
推荐指数
1
解决办法
3170
查看次数

工作单元属于EF4,IoC(Unity)和存储库?

我看到几个与此有关的问题,但我仍然无法找到我正在寻找的答案,所以我发布了我的问题.如果另一个问题得到答案(我只是没有看到),请指出我.

我正在试图找出我的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

7
推荐指数
1
解决办法
3957
查看次数

确保控制器在Unity中具有无参数的公共构造函数

我在控制器中遇到了这个问题:
尝试创建类型为' * .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# dependency-injection unity-container asp.net-mvc-4

7
推荐指数
1
解决办法
2万
查看次数

按属性划分C#unity拦截

有没有办法在C#unity中如何使用属性拦截并将对象注册代码保存在XML文件中(如app.config)?如果是的话,你能为我提供代码,这样的注册应该怎么样?我做了很多解决方法,但没有找到解决此问题的方法.

c# unity-container interception

7
推荐指数
1
解决办法
7257
查看次数

从Nuget下载Unity IoC容器时出错

我正在构建一个控制台应用程序,以便控制反转.我试图从nuget包管理器下载"Unity"IoC容器,但是遇到了这个错误.任何帮助都很有用.我正在使用visual studio 2010 pro.

下载包时出错

c# unity-container nuget

7
推荐指数
1
解决办法
2314
查看次数

有条件地解决Unity中的命名实现

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的自定义解析程序?

c# unity-container

7
推荐指数
1
解决办法
3696
查看次数

在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阅读所有的例子都是前一种风格而没有评论,所以我想知道我是否不理解它是如何工作的.

c# dependency-injection unity-container

7
推荐指数
1
解决办法
1143
查看次数