标签: unity-container

Unity和WCF库:在wcf库中加载统一的位置?

有人可以帮忙吗?

我创建了一个WCF库(不是应用程序),我将在SVC IIS页面中托管它.

但我想在通用的地方加载统一的东西...我可以加载它在global.asax但然后它绑定到IIS Asp.net容器,当做TDD这部分不会执行所以不是我的决议会工作.

WCF库是一个纯类,所以我怀疑我可以使用像OnStartup等任何事件?

唯一的方法我想到了服务从基类继承的内容以及调用某种类型的静态类并为统一进行引导的接口.

我有点失落,这是唯一的方式,还是有一些我不知道的方式.

基本上这个想法是......谁曾经调用过wcf库,那么统一注入需要发生..

有任何想法吗?

谢谢

c# tdd wcf ioc-container unity-container

8
推荐指数
1
解决办法
3138
查看次数

WPF unity尝试获取类型实例时发生激活错误

尝试使用Unity和Prism初始化模块时出现以下错误.该DLL被发现

return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
Run Code Online (Sandbox Code Playgroud)

找到dll并找到名称

  #region Constructors

    public AdminModule(
        IUnityContainer container,
        IScreenFactoryRegistry screenFactoryRegistry,
        IEventAggregator eventAggregator,
        IBusyService busyService
        )
        : base(container, screenFactoryRegistry)
    {
        this.EventAggregator = eventAggregator;
        this.BusyService = busyService;
    }

    #endregion

    #region Properties

    protected IEventAggregator EventAggregator { get; set; }
    protected IBusyService BusyService { get; set; }

    #endregion

    public override void Initialize()
    {
        base.Initialize();
    }

    #region Register Screen Factories

    protected override void RegisterScreenFactories()
    {
        this.ScreenFactoryRegistry.Register(ScreenKeyType.ApplicationAdmin, typeof(AdminScreenFactory));
    }

    #endregion

    #region Register Views and Various Services

    protected override …
Run Code Online (Sandbox Code Playgroud)

wpf modularity prism unity-container

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

具有Unity和单元测试的MVVM架构设计

我正在WPF中构建一个类似Visual Studio的应用程序,我在识别组件的最佳架构设计组织时遇到了一些问题.我计划使用Unity作为我的依赖注入容器和Visual Studio单元测试框架,并且可能使用moq来模拟库.

我将首先描述我的解决方案的结构,然后我的问题:

我有一个WPF项目,其中包含:

  • 应用程序启动时的Unity容器初始化(引导程序)(在App.xaml.cs中)
  • 我的所有应用程序视图(XAML).

另一个名为ViewModel的项目包含:

  • 我的所有应用程序ViewModels.我的所有ViewModel都从一个暴露ILogger属性的ViewModelBase继承

我的初始化逻辑如下:

  1. 应用程序启动
  2. Unity容器创建和类型注册:MainView和MainViewModel
  3. 解析我的MainView并显示它.

var window = Container.Resolve<MainView>();

window.Show();

我的MainView构造函数在其构造函数中接收MainViewModel对象:

public MainView(MainViewModel _mvm)
Run Code Online (Sandbox Code Playgroud)
  1. 我的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)

缺点:

  • 我没有使用Unity容器,因此我的依赖项(例如ILogger)不会自动解析

选项2:通过注释我的属性来使用setter注入:

[Dependency]
public ToolboxViewModel ToolboxVM{get; set;}
//... Same for rest …
Run Code Online (Sandbox Code Playgroud)

c# architecture unit-testing unity-container mvvm

8
推荐指数
1
解决办法
4019
查看次数

Unity 3和错误"类型名称或别名"xxxxx"无法解析.请检查您的配置文件并验证此类型名称."

有没有办法解决Unity 3的这个问题?

我已经尽一切可能绕过这个消息错误,但我无法解决; 我已经做了我在googles搜索中看到的所有内容.

我几乎放弃并尝试另一种DI解决方案.

我的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="Biblioteca" />
    <assembly name="Biblioteca.Contracts" />
    <assembly name="Biblioteca.Business" />
    <namespace name="Biblioteca" />
    <namespace name="Biblioteca.Contracts" />
    <namespace name="Biblioteca.Business" />
      <container>
        <register type="Biblioteca.Contracts.IManterCategoriaBO" mapTo="Biblioteca.Business.ManterCategoriaBO" />
      </container>
  </unity>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我的界面:

using Biblioteca.Transport;
using System.Linq;

namespace Biblioteca.Contracts
{
    public interface IManterCategoriaBO
    {
        IQueryable<CategoriaDTO> GetAll();
        CategoriaDTO GetById(int id);
        void Insert(CategoriaDTO dto);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的具体课程:

using Biblioteca.Contracts;
using Biblioteca.Transport;
using Biblioteca.Data;
using System;
using System.Linq;

namespace …
Run Code Online (Sandbox Code Playgroud)

c# unity-container n-tier-architecture asp.net-mvc-4

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

使用Unity和Web API控制器的自定义依赖项解析程序时出错

我使用以下类作为依赖项解析器.参考了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)

c# unity-container asp.net-web-api

8
推荐指数
1
解决办法
4313
查看次数

Unity.Mvc5中的Unity.WebApi.UnityDependencyResolver等价物

我在.NET 4.5应用程序中使用了以下代码:

UnityConfig.cs

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        container.RegisterType<a_interfaces.IAMessageRepository, ARepository.AMessageRepository>();

        DependencyResolver.SetResolver(new Unity.Mvc5.UnityDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
    }
}
Run Code Online (Sandbox Code Playgroud)

Global.asax中

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        UnityConfig.RegisterComponents();      
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        var _repo = (a_interfaces.IAMessageRepository)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(a_interfaces.IAMessageRepository));
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在需要针对.NET 4,我下载/安装了Unity.Mvc4(版本1.2).我在这一行得到以下错误:

GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

The type or namespace name 'WebApi' does not exist in the namespace 'Unity' (are you missing an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

有谁知道.NET 4的等效代码是什么?

c# asp.net unity-container asp.net-mvc-4 asp.net-web-api

8
推荐指数
0
解决办法
1810
查看次数

如何使用unity注入ApplicationUserManager

我这样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

8
推荐指数
1
解决办法
7422
查看次数

Unity Container Resolve

我刚开始使用Unity Container,我的注册看起来像这样:

static void UnityRegister()
{
      _container = new UnityContainer();
      _container.RegisterType<IBook, Book>();
      _container.RegisterType<IBookRepository, BookRepository>("Book");
      _container.RegisterType<IBookService, BookService>();
      _container.RegisterType<IBookRepository, DatabaseRepository>("Database");
}
Run Code Online (Sandbox Code Playgroud)

现在当我尝试解决这个问题:

var service = _container.Resolve<IBookService>("Database");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

解决依赖关系失败,type ="UnityConsoleEx.IBookService",name ="Database".在解决时发生异常:例外情况是:InvalidOperationException - 当前类型UnityConsoleEx.IBookService是一个接口,无法构造.你错过了类型映射吗?

At the time of the exception, the container was:

Resolving UnityConsoleEx.IBookService,Database
Run Code Online (Sandbox Code Playgroud)

谁能指出我做错了什么?

c# dependency-injection unity-container

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

如何在Template10中使用Unity IoC容器?

我有一个基于Template10的应用程序,并希望使用IoC处理我的依赖注入.我倾向于使用Unity来实现这个目标.我的应用程序分为三个程序集:

  1. UI(通用应用)
  2. UI逻辑(通用库)
  3. 核心逻辑(便携式图书馆).

我有这些问题:

  1. 我应该为整个应用程序使用单个容器,还是为每个程序集创建一个容器?
  2. 我应该在哪里创建容器并注册我的服务?
  3. 各种程序集中的不同类应该如何访问容器?单身人士模式?

我已经阅读了很多关于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)

.net c# unity-container uwp template10

8
推荐指数
1
解决办法
1257
查看次数

如何正确地将"TempDataDictionary"注入我的类?

我有一个使用c#和ASP.NET MVC 5编写的应用程序.我也使用Unity.Mvc进行依赖注入.

与许多其他类一起,该类MessageManagerIoC容器中注册.但是,MessageManager该类依赖于TempDataDictionary执行其工作的实例.此类用于为视图编写临时数据.

为了解决MessageManager我需要也注册一个实例的实例TempDataDictionary.我需要能够TempDataDictionaryMessageManager类中添加值,然后我需要从视图中访问临时数据.因此,我需要能够访问TempDataDictionary视图中的相同实例,以便我可以将消息写出给用户.

此外,如果控制器将用户重定向到其他地方,我不想丢失消息,我仍然希望能够在下一个视图上显示消息.

我尝试了以下注册TempDataDictionaryMessageManager:

Container.RegisterType<TempDataDictionary>(new PerThreadLifetimeManager())
         .RegisterType<IMessageManager, MessageManager>();
Run Code Online (Sandbox Code Playgroud)

然后在我看来,我有以下解决方案的实例 IMessageManager

var manager = DependencyResolver.Current.GetService<IMessageManager>();
Run Code Online (Sandbox Code Playgroud)

但是,由于某种原因,消息会丢失.也就是说,当我解决时manager,TempDataDictionary不包含MessageManager从控制器添加的任何消息.

如何才能正确注册实例,TempDataDictionary以便数据在查看之前一直存在?

更新 这是我的IMessageManager界面

public interface IMessageManager
{
    void AddSuccess(string message, int? dismissAfter = null);
    void AddError(string message, int? dismissAfter = null);
    void AddInfo(string message, int? dismissAfter = null); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unity-container asp.net-mvc-5

8
推荐指数
1
解决办法
457
查看次数