我有一个通用类型接口,并希望对象的构造函数采用通用接口.
喜欢:
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) 我终于在C#中围绕IoC和DI缠绕我的头,并且正在努力解决一些问题.我正在使用Unity容器,但我认为这个问题适用范围更广.
使用IoC容器来分配实现IDisposable的实例让我感到害怕!你怎么知道你应该Dispose()?该实例可能是专门为您创建的(因此您应该Dispose()它),或者它可能是其生命周期在其他地方管理的实例(因此您最好不要).代码中没有任何内容告诉您,实际上这可能会根据配置发生变化!这对我来说似乎是致命的.
任何IoC专家都可以描述处理这种模糊性的好方法吗?
我知道类似的问题被多次询问(例如:这里,这里,这里和这里),但它是针对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) 在典型的Spring MVC项目中有两个"容器":一个由ContextLoaderListener创建,另一个由DispatchServlet创建.
我想知道,这些真的是两个IoC容器实例吗?(我看到两个bean配置文件,一个是root-context.xml
另一个servlet-context.xml
)
如果有2个容器,那么这种关系是什么?
在一个容器中声明的bean可以在另一个容器中使用吗?
我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;
我的问题基本上是我应该使用Ninject 2做IoC,考虑到......
我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:
有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......
谢谢!
我使用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
我有以下(简化)情况:我有两个接口
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将同一个类绑定到两个接口.因为我想要使用相同的IAmAnImplementation
beeing 实例,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
我正在考虑在用户界面中使用Microsoft Unity作为我的依赖注入工具.
我们的中间层已经使用Castle Windsor,但我认为我应该坚持使用Microsoft.
有没有人对最好的依赖注入工具有什么想法?
.net dependency-injection castle-windsor ioc-container inversion-of-control
我一直在寻找Common Service Locator作为抽象我的IoC容器的方法,但我注意到有些人强烈反对这种类型.
人们建议永远不要使用它吗?一直在使用它?或者有时使用它?如果有时候,那么在什么情况下你会使用它以及你不会使用它的情况.
c# dependency-injection inversion-of-control common-service-locator service-locator
我有一些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上的例子,似乎都忽略了依赖关系的发布.
谢谢!
c# ×5
.net ×3
idisposable ×2
ninject ×2
spring ×2
asp.net-mvc ×1
builder ×1
generics ×1
java ×1
ninject-3 ×1
signalr ×1
signalr-hub ×1
spring-mvc ×1