我遇到了一个我现在无法解决的问题.我有以下内容:
UnityHelper.DefaultContainer.RegisterInstance(typeof(IMyInterface), "test", instance);
Run Code Online (Sandbox Code Playgroud)
UnityHelper.DefaultContainer我的助手在哪里获得带有加载配置的统一容器.
在这里我注册instance为一个实例IMyInterface.
所以在任何地方(使用后一段时间)我想删除此映射.完全删除它.我怎么能这样做?
我试过了:
UnityHelper.DefaultContainer.Teardown(instance)
Run Code Online (Sandbox Code Playgroud)
但是不成功,以下代码仍会返回instance:
UnityHelper.DefaultContainer.ResolveAll<IMyInterface>()
Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft Unity.我有一个接口ICustomerService及其实现CustomerService.我可以使用以下代码为Unity容器注册它们:
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
如果CustomerService在其构造函数中有某个参数(例如ISomeService1),我使用以下代码(我需要指定SomeService1):
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager(), new InjectionConstructor(new SomeService1()));
Run Code Online (Sandbox Code Playgroud)
这里没问题.
当CustomerService类在其构造函数中有两个参数(不是前一个示例中的一个参数)时会出现问题(例如ISomeService1和ISomeService2).当我使用以下代码时它工作正常:
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager(), new InjectionConstructor(new SomeService1(), new SomeService2()));
问题是我不想指定SomeService2()第二个参数.我只想指定第一个参数 - SomeService1().但我得到的错误是我需要指定一个或两个参数.
如何只指定构造函数的第一个参数?
最近宣布的.NET 4.0托管可扩展性框架(MEF)是一个依赖注入框架吗?模式和实践中的Microsoft Unity在4.0中是否会过时?MEF与Unity这样的框架相比如何?
我知道Unity可以配置为使用类的构造函数来创建类的实例(如下所示),但这不是我想要的.
container.RegisterType<IAuthoringRepository, AuthoringRepository>();
Run Code Online (Sandbox Code Playgroud)
我想将Unity配置为使用工厂方法,将windows身份作为参数传递(即RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent()):),解析一种类型的IAuthoringRepository.我该怎么做呢?
在我的引导程序中:
namespace Conduit.Mam.ClientServices.Common.Initizliaer
{
public static class Initializer
{
private static bool isInitialize;
private static readonly object LockObj = new object();
private static IUnityContainer defaultContainer = new UnityContainer();
static Initializer()
{
Initialize();
}
public static void Initialize()
{
if (isInitialize)
return;
lock (LockObj)
{
IUnityContainer container = defaultContainer;
//registering Unity for MVC
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
//registering Unity for web API
// GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
#region managers
container.RegisterType<ISettingsManager, SettingsManager>();
container.RegisterType<IMamDataManager, MamDataManager>();
container.RegisterType<IAppsDataManager, AppsDataManager>();
#endregion
if (!isInitialize)
{
isInitialize = true;
} …Run Code Online (Sandbox Code Playgroud) 请帮忙 - 我迷路了!
我正在编写一个小型桌面应用程序,它有一些控件和一些屏幕.这应该稍后与一个小网站集成,也有一些屏幕.我们的想法是让用户编辑视频并选择图像,然后与朋友分享他们的结果.
桌面应用程序使用的是C#WPF,即网站 - ASP.Net MVC.
我读到使用MVVM可以更轻松地将应用程序增加到几个屏幕.所以我开始搜索并发现了Caliburn.Micro和MVVM.Light.我已经下载了一些教程,但正如我准备深入研究材料一样,我在SO上找到了.那里还有Prism,MEF,Unity,ReactiveUI - 这太过分了!
我学习新东西很糟糕 - 学习WPF和ASP.Net MVC花了我很多年的时间.我不想研究很多新材料,只是为了稍后发现它不相关.而且我没有一位建筑师来指导我.
所以我的问题是:你能否对这些框架和技术进行透视,并建议我应该把重点放在研究和使用上(特别是后来用于Windows 8的内容)?
我们有一个场景,用户可以在运行时选择不同的硬件.在后台我们有几个不同的硬件类,它们都实现了一个IHardware接口.我们希望使用Unity为此接口注册当前选定的硬件实例.但是,当用户选择其他硬件时,这将要求我们在运行时替换此注册.
以下示例可能会更清楚:
public interface IHardware
{
// some methods...
}
public class HardwareA : IHardware
{
// ...
}
public class HardwareB : IHardware
{
// ...
}
container.RegisterInstance<IHardware>(new HardwareA());
// user selects new hardware somewhere in the configuration...
// the following is invalid code, but can it be achieved another way?
container.ReplaceInstance<IHardware>(new HardwareB());
Run Code Online (Sandbox Code Playgroud)
这种行为能以某种方式实现吗?
顺便说一句:我完全清楚,从容器中解决的实例当然不会被新实例替换.我们会通过强迫他们再次解决实例来照顾自己.
如何使用类型没有NO PARAMETER构造函数的容器注册类型.
实际上我的构造函数接受一个字符串,我通常传入一个表示Path的字符串.
所以当我解决它时会自动创建新类型但是传入一个字符串?
我下载了Prism v4并运行了安装程序.我进入目录并运行以下两个批处理文件:
当我编译这些应用程序时,我没有看到任何真正的区别.我已经搜索了MEF vs Unity,我发现了一些优点/缺点,但没有任何具体说明是否一个人在Prism中使用"更好"(我知道这是主观的).我想也许如果我列出我的要求,有人可以指出我使用的正确技术(即使它不是Prism 4).
例如:
基本用户可能有以下选项:
所有相关地址都在Address.dll内.
高级用户可能具有以下选项:
所有相关地址都在Address.dll内.
管理相关的所有项目都在Admin.dll中.
应用程序不应该实际引用这些DLL中的任何一个,我打算反映它们,以便如果有100个不同的模块,并且用户只能访问其中的2个,则只下载和使用其中的2个.有权访问其中10个的用户获得10个用户.
我已经通过WebService解决了下载DLL.:)
我正在使用可以被其他组件重用的类库.在这个类库中,我使用unity来进行依赖注入.对于这个类库,我创建了一个测试项目.调用者也获得了一个测试项目.我不确定的一件事是绑定的位置.我应该在类库中加入它还是应该从调用应用程序中执行此操作?
c# dependency-injection inversion-of-control unity-container
unity-container ×10
c# ×5
mef ×3
.net ×1
asp.net ×1
asp.net-mvc ×1
instance ×1
mvvm ×1
mvvm-light ×1
prism ×1
prism-4 ×1
registering ×1
wpf ×1