下面解释如何在代码中执行此操作: Unity将两个接口注册为一个单例
_container.RegisterType<EventService>(new ContainerControlledLifetimeManager());
_container.RegisterType<IEventService, EventService>();
_container.RegisterType<IEventServiceInformation, EventService>();
bool singleton = ReferenceEquals(_container.Resolve<IEventService>(), _container.Resolve<IEventServiceInformation>());
Run Code Online (Sandbox Code Playgroud)
如何在XML配置中执行此操作?
我有一个标准的Order/OrderLineItem设置.
白天生成的许多退款在白天持续存在,退款包括订单ID和1个或多个LineItemId.我需要在一天结束时将这些(在Windows服务中)合并到信用卡,礼品卡,奖励卡等中.
我一直在阅读Mark Seemann的书,可以看到使用Composition Root来勾勒对象图的好处.
整合过程本身就是我需要做的最多的组合.
我不明白的是这个整合逻辑应该在哪里结束?我可以假设,无论合并逻辑在哪里结束,我仍然只在组合根中使用类似Unity的东西,那组合应该很早就发生?
很高兴提供更多信息或酌情澄清!
.net c# domain-driven-design dependency-injection unity-container
我正在WPF中构建一个类似Visual Studio的应用程序,我在识别组件的最佳架构设计组织时遇到了一些问题.我计划使用Unity作为我的依赖注入容器和Visual Studio单元测试框架,并且可能使用moq来模拟库.
我将首先描述我的解决方案的结构,然后我的问题:
我有一个WPF项目,其中包含:
另一个名为ViewModel的项目包含:
我的初始化逻辑如下:
var window = Container.Resolve<MainView>();
window.Show();
我的MainView构造函数在其构造函数中接收MainViewModel对象:
public MainView(MainViewModel _mvm)
Run Code Online (Sandbox Code Playgroud)
我的MainViewModel为每个面板都有一个Child ViewModel:
public ToolboxViewModel ToolboxVM{get; set;}
public SolutionExplorerViewModel SolutionExplorerVM { get; set; }
public PropertiesViewModel PropertiesVM { get; set; }
public MessagesViewModel MessagesVM { get; set; }
Run Code Online (Sandbox Code Playgroud)我打算创建一个初始化每个面板的InitializePanels()方法.
现在我的问题是:我的MainViewModel.InitializePanels()如何初始化所有这些面板?给出以下选项:
选项1:手动初始化ViewModels:
ToolboxVM = new ToolboxViewModel();
//Same for the rest of VM...
Run Code Online (Sandbox Code Playgroud)
缺点:
选项2:通过注释我的属性来使用setter注入:
[Dependency]
public ToolboxViewModel ToolboxVM{get; set;}
//... Same for rest …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的依赖树,Unity正在尝试解决这个巨大的依赖链中某处的依赖.我不得不手动查看所有依赖项来找出可能缺少的东西,这是一项艰巨的任务.
不幸的是,unity只报告它试图在它抛出的异常中构造的项目,并且没有提供有关它到达该点的路径的信息.
Unity是否发布了任何跟踪/日志信息,可以帮助我确切地确定我缺少哪些依赖项?
我为我们的项目设置了Unity for dependency injection.项目本身是一个使用MVC和Web API的ASP.NET应用程序.
对于数据库上下文,我正在使用PerRequestLifetimeManager.这样做是为了使业务逻辑的不同位使用相同的上下文(因而是相同的事务).
为了能够使用PerRequestLifetimeManager,我添加了针对ASP.NET MVC的nuget包Unity引导程序和ASP.NET Web API的Unity引导程序的引用.
要在Web API中使用此生命周期管理器,已在启动代码中添加以下行:
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
Run Code Online (Sandbox Code Playgroud)
Unity容器是为MVC和Web API设置的:
var container = BuildUnityContainer();
GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(container);
System.Web.Mvc.DependencyResolver.SetResolver(new Microsoft.Practices.Unity.Mvc.UnityDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
在构建Unity容器时,数据库上下文设置为按请求以下列方式解析:
container.RegisterType<IDataContext>(new PerRequestLifetimeManager(),
new InjectionFactory(c =>
{
// Some code
return new DataContext(/* params */);
}
));
Run Code Online (Sandbox Code Playgroud)
但是,似乎这段代码并没有DataContext为每个请求提供新的代码.它在一个请求中给出了我在不同地方的相同上下文(这很好).但是,后续(web api)请求被赋予了相同的实例DataContext,我希望为每个新请求创建一个新的请求.我也希望在DataContext请求完成后(类实现IDisposable)正确处理.
这里发生了什么?我是否缺少一些配置才能使其正常工作?或者这不应该像我期望的那样工作?
我使用以下类作为依赖项解析器.参考了http://www.asp.net/web-api/overview/advanced/dependency-injection
public class UnityWebAPIResolver : IDependencyResolver
{
protected IUnityContainer container;
public UnityWebAPIResolver(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType); **// This line throws error**
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType); **// This line throws error**
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写身份验证属性以应用于WCF服务应用程序中的某些服务(使用Unity和Unity.Wcf).
认证由外部(到服务应用程序)认证接口执行,该接口当前通过构造注入注入到服务类中并在每个服务方法中直接调用.
这导致每种服务方法中的大量重复代码.
相反,我想将其移动到属性.
但是,我需要在属性中访问身份验证界面.
显然,如果我在属性上使用构造注入,那么在使用属性装饰我的服务方法时它就是一个必需参数,但此时我无法访问它,因为它是由Unity连接的.
如何在属性中注入(或以其他方式访问)身份验证界面?
我这样ApplicationUserManager定义:
public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{
}
public override Task<IdentityResult> CreateAsync(ApplicationUser user, string password)
{
var result = base.CreateAsync(user, password);
//...
Repository.DoSomething(...); //Repository is null here
//..
}
[Dependency]
public IRepository Repository { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我的存储库没有被注入.Repository总是null
我的统一配置中也有这一行
.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager())
Run Code Online (Sandbox Code Playgroud)
如何注射?
更新N:
这是我的控制器的代码; 我是怎么得到的UserManager:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
} …Run Code Online (Sandbox Code Playgroud) dependency-injection unity-container asp.net-identity asp.net-web-api2
我有几个类依赖于类ILogger.实现ILogger需要知道它是记录器的类型,即ILoggerfor Foo将是new Logger(typeof(Foo)),因为Bar它将是new Logger(typeof(Bar)),等等.
我希望Unity自动注入合适的记录器; 换句话说,当我打电话时container.Resolve<Foo>(),我希望将a new Logger(typeof(Foo))注入到Foo实例中.
如何在Unity中进行设置?有没有办法将被解析的类型传递给依赖项?
(在我真正的代码,我其实有ILoggerFactory一个Create方法,这也需要一个类型作为参数,所以我可以在工厂只是传递给我的课,他们会叫Create自己能得到相应的记录仪,但它不是那么优雅正如我想要实现的那样)
一些代码使事情更清晰:
interface ILogger
{
...
}
class Logger : ILogger
{
private readonly Type _type;
public Logger(Type type)
{
_type = type;
}
...
}
class Foo
{
private readonly ILogger _logger;
public Foo(ILogger logger) // here I want a Logger with its type set to …Run Code Online (Sandbox Code Playgroud) 我有一个基于Template10的应用程序,并希望使用IoC处理我的依赖注入.我倾向于使用Unity来实现这个目标.我的应用程序分为三个程序集:
我有这些问题:
我已经阅读了很多关于DI和IoC的内容,但我需要知道如何在实践中应用所有理论,特别是在Template10中.
注册代码:
// where should I put this code?
var container = new UnityContainer();
container.RegisterType<ISettingsService, RoamingSettingsService);
Run Code Online (Sandbox Code Playgroud)
然后是检索实例的代码:
var container = ???
var settings = container.Resolve<ISettingsService>();
Run Code Online (Sandbox Code Playgroud) unity-container ×10
c# ×8
.net ×3
architecture ×1
asp.net-mvc ×1
attributes ×1
mvvm ×1
template10 ×1
unit-testing ×1
uwp ×1
wcf ×1