C# 在Unity中的程序集之间共享实例
目前我正在使用一个singleton类,它在我使用它的每个地方都可以正常工作。不过,我想使用Unity IoC容器来实现这一点。按以下方式注册它与我希望的方式不一样:C# 在Unity中的程序集之间共享实例,c#,unity-container,C#,Unity Container,目前我正在使用一个singleton类,它在我使用它的每个地方都可以正常工作。不过,我想使用Unity IoC容器来实现这一点。按以下方式注册它与我希望的方式不一样: container.RegisterInstance(new SomeNiceClass(), new ContainerControlledLifetimeManager()); 意思是如果我这样做: container.Resolve<SomeNiceClass>(); container.Resolve();
container.RegisterInstance(new SomeNiceClass(), new ContainerControlledLifetimeManager());
意思是如果我这样做:
container.Resolve<SomeNiceClass>();
container.Resolve();
在程序集中的一个类中(它不是第一次注册的),我将获得一个新实例。只要您将引用传递给同一个容器,程序集边界就不重要 您可以尝试将其命名为:
container.RegisterInstance<SomeNiceClass>("MySingleton", new SomeNiceClass(), new ContainerControlledLifetimeManager());
container.Resolve<SomeNiceClass>("MySingleton");
请在此处阅读MSDN对此的评论:
如果仍然存在问题,则需要重新审视如何处理容器。正如您自己所注意到的,您需要使用相同的容器实例 您可以通过Unity的
IModule
界面来实现这一点
[Module(ModuleName="MyExternalModule", OnDemand=false)]
public class MyExternalModule : IModule
{
private readonly IUnityContainer container;
public MyExternalModule(IUnityContainer container)
{
if (container == null)
throw new ArgumentNullException("container");
this.container = container;
}
public void Initialize()
{
container.RegisterInstance(new MyService());
}
}
在应用程序中,注册模块:
public class ApplicationBootstrapper : UnityBootstrapper
{
protected override IModuleCatalog CreateModuleCatalog()
{
var moduleCatalog = new ModuleCatalog();
moduleCatalog.AddModule(typeof(YourCompany.MyModule.MyExternalModule), InitializationMode.WhenAvailable);
return moduleCatalog;
}
...
}
编辑:
另外,您的模块不应实例化它们自己的容器。容器只需在主应用程序中实例化。模块只做注册,没有更多
若您需要模块中的容器实例(在IModule
实现之外),您只需要在构造函数中声明它
public class MyModuleResolver
{
private readonly IUnityContainer container;
public MyModuleResolver(IUnityContainer container)
{
if(container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
}
但是,请注意,在域/业务层中直接引用容器不是一个好的做法。您必须自己使用IUnityContainer
的原因只有两个:
其他一切都应该通过注入从容器中自动完成 我也遇到了同样的问题(不确定为什么每个人都评论说它很难或不可能复制——从我看来,这很简单 仅供参考,以下是复制的步骤:
因此,回到最初发布这个问题的人——以及其他寻找答案的人——如果您看到您的单例在Unity中被实例化了不止一次,那么可能需要再次检查您是否多次加载模块或注册类型。以这种方式从同一容器中注册对象的新实例是非常困难的非常困难(我无法想象你们声称看到的实现结果的方式)。请尝试提供至少与您的设置相似的或代码。我想您误解了我的意思。我的意思是,我不能使用Unity framework共享对象的实例,因为即使我在一个程序集中使用
RegisterInstance
,我在另一个程序集中仍然会得到一个新的实例。我使用单例进行了肮脏的变通。我不喜欢这样解决方案,我更愿意在这个问题上使用Unity。这段代码类似于我的设置-在一个程序集中我正在注册,在另一个程序集中我正在尝试获取实例。我显然误解了你的问题…正如我所说,当调用container.Resolve();
时,我看不到实现你描述的行为的方法
public class MyModuleResolver
{
private readonly IUnityContainer container;
public MyModuleResolver(IUnityContainer container)
{
if(container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
}