标签: inversion-of-control

通用类型在构造函数中

我有一个通用类型接口,并希望对象的构造函数采用通用接口.
喜欢:

public Constructor(int blah, IGenericType<T> instance)
{}
Run Code Online (Sandbox Code Playgroud)

我希望创建此对象的代码指定IGenericType(使用Inversion of Control).我还没有看到这种情况发生的方法.有什么建议可以实现吗?

我希望有人创建对象,如:

Constructor varname = new Constructor(1, new GenericType<int>());
Run Code Online (Sandbox Code Playgroud)

.net c# generics inversion-of-control

41
推荐指数
1
解决办法
6万
查看次数

你如何协调IDisposable和IoC?

我终于在C#中围绕IoC和DI缠绕我的头,并且正在努力解决一些问题.我正在使用Unity容器,但我认为这个问题适用范围更广.

使用IoC容器来分配实现IDisposable的实例让我感到害怕!你怎么知道你应该Dispose()?该实例可能是专门为您创建的(因此您应该Dispose()它),或者它可能是其生命周期在其他地方管理的实例(因此您最好不要).代码中没有任何内容告诉您,实际上这可能会根据配置发生变化!这对我来说似乎是致命的.

任何IoC专家都可以描述处理这种模糊性的好方法吗?

c# idisposable inversion-of-control unity-container

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

Unity 2.0和处理IDisposable类型(特别是使用PerThreadLifetimeManager)

我知道类似的问题被多次询问(例如:这里,这里,这里这里),但它是针对Unity的早期版本,其答案取决于使用的LifetimeManager类.

文件说:

Unity使用从LifetimeManager基类继承的特定类型(统称为生命周期管理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例.

好的,听起来不错所以我决定检查生命周期管理器中的构建实现.我的结论:

  • TransientLifetimeManager - 没有处理处理.Container仅解析实例,并且不会跟踪它.调用代码负责处理实例.
  • ContainerControlledLifetimeManager - 处理终身经理时的实例(=处置容器时).提供在层次结构中的所有容器之间共享的单例实例.
  • HierarchicalLifetimeManager- 从中获取行为ContainerControlledLifetimeManager.它在hiearchy(子容器)中为每个容器提供"单例"实例.
  • ExternallyControlledLifetimeManager - 没有处理处理.正确的行为,因为容器不是实例的所有者.
  • PerResolveLifetimeManager - 没有处理处理.它通常是相同的,TransientLifetimeManager但它允许在解析整个对象图时重用实例来进行依赖注入.
  • PerThreadLifetimeManager - 没有处理处理,如MSDN中所述.谁负责处置?

内置的实现PerThreadLifetimeManager是:

public class PerThreadLifetimeManager : LifetimeManager
{
    private readonly Guid key = Guid.NewGuid();
    [ThreadStatic]
    private static Dictionary<Guid, object> values;

    private static void EnsureValues()
    {
        if (values == null)
        {
            values = new Dictionary<Guid, object>();
        }
    }

    public override object GetValue()
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# idisposable inversion-of-control unity-container

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

关于spring框架中的多个容器

在典型的Spring MVC项目中有两个"容器":一个由ContextLoaderListener创建,另一个由DispatchServlet创建.

我想知道,这些真的是两个IoC容器实例吗?(我看到两个bean配置文件,一个是root-context.xml另一个servlet-context.xml)

如果有2个容器,那么这种关系是什么?

在一个容器中声明的bean可以在另一个容器中使用吗?

spring dependency-injection spring-mvc inversion-of-control

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

我应该在哪里注射Ninject 2+(我如何安排我的模块?)

我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;

  1. 具有其他几个项目使用的功能的类库.
  2. ASP.NET MVC应用程序.

我的问题基本上是我应该使用Ninject 2做IoC,考虑到......

  • 类库需要一些DI爱,其中包括需要Web请求特定会话对象的存储库类(想想工作单元).
  • MVC应用程序需要DI,因为在Ninject 2中你基本上都是从NinjectHttpApplication继承的.
  • 类库的单元测试需要注意这一点,以注入一组不同的存储库.
  • 出于同样的原因,需要注入Web应用程序的单元测试.

我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:

  • 我不能在类库中做DI ,因为MVC应用程序需要从NinjectHttpApplication继承而开始.
  • 我不能只在MVC应用程序中执行DI - 毕竟,类库是由其他库使用的,并且MVC应用程序不应该对库的内部结构有太多了解.
  • 我想这是我能看到的唯一出路:两个项目的独立IoC.类库和MVC应用程序都有自己的IoC设置,并为他们的东西做DI,而不是真正关心彼此.

有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......

谢谢!

asp.net-mvc ninject inversion-of-control

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

Spring:使用构建器模式创建bean

我使用ektorp连接到CouchDB.

构建ektorp HttpClient实例的方法是使用构建器模式:

HttpClient httpClient = new StdHttpClient.Builder()
                                .host("mychouchdbhost")
                                .port(4455)
                                .build();
Run Code Online (Sandbox Code Playgroud)

我对Spring比较陌生.请告诉我如何HttpClient在我的上下文中配置一个来创建它Builder.

一种方法是这样做@Configuration.还有其他选择吗?

java spring dependency-injection builder inversion-of-control

38
推荐指数
2
解决办法
3万
查看次数

是否可以将不同的接口绑定到实现所有接口的同一个实例?

我有以下(简化)情况:我有两个接口

interface IAmAnInterface
{
    void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

interface IAmAnInterfaceToo
{
    void DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

和一个实现两者的类:

class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo
{
    public IAmAnImplementation()
    {
    }

    public void DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用Ninject将同一个类绑定到两个接口.因为我想要使用相同IAmAnImplementationbeeing 实例,IAmAnInterface而且IAmAnInterfaceToo很明显我需要某种单例.我和ninject.extensions.namedscope一起,InScope()但没有成功.我的最后一次尝试是:

Bind<IAmAnImplementation>().ToSelf().InSingletonScope();
Bind<IAmAnInterface>().To<IAmAnImplementation>().InSingletonScope();
Bind<IAmAnInterfaceToo>().To<IAmAnImplementation>().InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当我通过kernel.Get<IDependOnBothInterfaces>();它请求我的测试类的实例时实际上使用了不同的实例IAmAnImplementation.

class IDependOnBothInterfaces
{
    private IAmAnInterface Dependency1 { get; set; }
    private IAmAnInterfaceToo Dependency2 { get; set; }

    public IDependOnBothInterfaces(IAmAnInterface i1, …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection ninject inversion-of-control ninject-3

38
推荐指数
1
解决办法
5938
查看次数

我应该使用哪种依赖注入工具?

我正在考虑在用户界面中使用Microsoft Unity作为我的依赖注入工具.

我们的中间层已经使用Castle Windsor,但我认为我应该坚持使用Microsoft.

有没有人对最好的依赖注入工具有什么想法?

.net dependency-injection castle-windsor ioc-container inversion-of-control

37
推荐指数
4
解决办法
1万
查看次数

您什么时候使用公共服务定位器?

我一直在寻找Common Service Locator作为抽象我的IoC容器的方法,但我注意到有些人强烈反对这种类型.

人们建议永远不要使用它吗?一直在使用它?或者有时使用它?如果有时候,那么在什么情况下你会使用它以及你不会使用它的情况.

c# dependency-injection inversion-of-control common-service-locator service-locator

36
推荐指数
3
解决办法
1万
查看次数

适用于SignalR和Castle Windsor的Hub依赖生命周期管理

我有一些SignalR集线器可能需要访问一些瞬态和单独的依赖项.挂起Hub的创建很容易并且工作正常但是SignalR在创建的Hub上执行自己的Dispose()调用,而不是通知依赖解析器并让它参与处理.

如果依赖项是注册单例,这不是什么大问题,但如果它们被注册为瞬态,那么它们将永远不会被处置(如果需要的话)并且Windsor将保持它们存活直到收集Windsor容器(当无论如何,Web服务器正在关闭).

我看到几种可能的处理方法......

a)这里有人指出了一种方法来将SignalR的HubDispatcher类子类化,以便它可以进行适当的处​​理.它不是SignalR的标准DependencyResolver的一部分,所以这可能很难/不可能

b)管道中其他地方的SignalR中的其他一些类可以被覆盖或轻松替换,以便我们可以继承HubDispatcher并确保使用子类.据我所知,这将是Owin中间件类HubDispatcherMiddleware.有没有办法迫使Owin不注册这个类,而是注册我自己的版本(这又使用我自己的HubDispatcher)?

c)有一种方法可以拦截SignalR在我的Hub类上进行的Dispose()调用,这样就可以调用Windsor来确保任何依赖关系被正确处理并从容器中释放

d)谨慎地避免使用瞬态生活方式依赖项,而是传入类型化工厂,以便我们可以通过Hub中的类型化工厂解决和释放每个依赖项

目前(d)是我知道该怎么做的唯一一个.(a)或(b)会很棒.(c)主要由本文http://kozmic.net/2010/01/27/transparently-releasing-components-in-windsor/涵盖,但是,拦截器要求通过IDisposable调用Dispose().SignalR的HubDispather类实现了集线器处理

private static void DisposeHubs(IEnumerable<IHub> hubs)
{
    foreach (var hub in hubs)
    {
        hub.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有转换到IDisposable那里...... Hub类上的Dispose()是虚拟的,而且博客帖子暗示虚拟Dispose()可能会增加一些复杂性(我不太确定多少,我不太了解无论如何,Castle的拦截器以及是否可以使用IDisposable进行处理.

我很欣赏我已经为一个相当狭隘的观众写了这个问题 - 那些使用过Windsor和SignalR而不仅仅是解决依赖关系的人.我发现的每个例子,包括StackOverflow上的例子,似乎都忽略了依赖关系的发布.

谢谢!

castle-windsor inversion-of-control signalr signalr-hub

36
推荐指数
1
解决办法
2952
查看次数