标签: unity-container

将无参数构造函数设置为容器创建中的注入构造函数

我有一个有两个ctors的课.一个无参数和一个带参数.
Unity将默认采用gready方法并转到最后一个ctor.

如何定义要使用的ctor(我想参数化)而不在我的类中添加对Unity的依赖?我认为可以在我的容器创建中做到这一点,但我不知道如何.

目前我的注册条目如下所示:

container.RegisterType<IConfigurationService, SqlConfigurationService>()
Run Code Online (Sandbox Code Playgroud)

更新
我试图尽可能避免在XML(配置文件)中编程.

EXTRA
如何使用一个参数注册一个构造函数(它应该被注入)?
说ILoggerService已经注册,我想使用构造函数

public SqlConfigurationService(ILoggerService logger){}
Run Code Online (Sandbox Code Playgroud)

c# ioc-container unity-container

9
推荐指数
1
解决办法
4091
查看次数

Unity Framework IoC使用默认构造函数

我正试图像这样向我的MVC控制器注入一个依赖项

private static void RegisterContainer(IUnityContainer container)
{            
    container
        .RegisterType<IUserService, UserService>()
        .RegisterType<IFacebookService, FacebookService>();
}
Run Code Online (Sandbox Code Playgroud)

UserService类有一个像这样的构造函数...

public UserService(): this(new UserRepository(), new FacebookService())
{
    //this a parameterless constructor... why doesnt it get picked up by unity?
}

public UserService(IUserRepository repository, IFacebookService facebook_service)
{
    Repository=repository;
    this.FacebookService=facebook_service;
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是以下......

当前类型Repositories.IUserRepository是一个接口,无法构造.你错过了类型映射吗?

看起来它正在尝试将一个构造函数注入到服务中,但是默认就足够了吗?为什么它不映射到无参数构造函数?

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

9
推荐指数
1
解决办法
7692
查看次数

你如何处理IoC和DI的"深层"依赖?

我是IoC的新手,我正在玩Unity.假设你有'n'项目的解决方案,你想使用Unity来注册和解决依赖关系.比方说,你的作文根是在项目一个.假设您在解决方案中有以下项目.

A B C D

让我们说a取决于b中的某些东西,b取决于cc中的某些东西取决于d中的某些东西

我已经看到你如何使用构造函数注入来解决a => b依赖关系但我仍然坚持如何解决bc 依赖性而无需访问在项目a中配置和创建的容器.

解决嵌套依赖项的方法是什么?是否存在解决深度依赖关系的讨论/博客/示例?

c# dependency-injection ioc-container unity-container

9
推荐指数
1
解决办法
2149
查看次数

什么是Microsoft Unity?

我正在寻找Unity的一些基本示例/解释.我很难掌握这个概念.我对注入模式有基本的了解,因为Unity似乎与它紧密相关.我感谢任何帮助.

design-patterns dependency-injection inversion-of-control unity-container

9
推荐指数
1
解决办法
1908
查看次数

使用Unity Container时,没有为此对象异常定义无参数构造函数

我在trynig加载视图时遇到上述异常.

我正在使用Unity来初始化我的控制器实例.仍然得到上述错误.

这是我的控制器.

public class SiteController : Controller
{

    private ISiteRepository _repository;

    public SiteController(ISiteRepository repository)
    {
        _repository = repository;
    }

    //
    // GET: /Site/

    public ActionResult Index()
    {
        return View();
    }

    //
    // GET: /Site/Details/5

    public ActionResult Details(int id)
    {
        return View();
    }}
Run Code Online (Sandbox Code Playgroud)

这是我的Global.asax.cs

protected void Application_Start()
    {
        ConfigApi(GlobalConfiguration.Configuration);
        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

    static void ConfigApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();
        unity.RegisterType<SiteController>();
        unity.RegisterType<ISiteRepository, SiteRepository>(new HierarchicalLifetimeManager());

        config.DependencyResolver = new IocContainer(unity);
    }
Run Code Online (Sandbox Code Playgroud)

这是我的SiteRepository类.

public class SiteRepository:ISiteRepository
{
    private readonly …
Run Code Online (Sandbox Code Playgroud)

ioc-container unity-container c#-4.0 asp.net-mvc-3

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

使用Unity,如何注册泛型的类型映射?

我正在尝试为Entity Framework实现存储库解决方案,但是我在使用Unity注册包含泛型的类型时遇到了问题.

鉴于:

    // IRepository interface
    public interface IRepository<TEntity>
    {
        // omitted for brevity
    }

    // Repository implementation
    public class Repository<TEntity, TContext> : IRepository<TEntity>, IDisposable 
            where TEntity : class
            where TContext : DbContext
    {
        // omitted for brevity
    }

    // service layer constructor
    public MyServiceConstructor(IRepository<Account> repository)
    {
        _repository = repository;
    }
Run Code Online (Sandbox Code Playgroud)

我需要将IRepository的类型映射注册到Repository.但是我在使用这种映射的Unity语法时遇到了麻烦.

我试过以下没有运气:

container.RegisterType<IRepository<>, typeof(Repository<,>)>();
container.RegisterType<typeof(IRepository<>), Repository<,>>();
Run Code Online (Sandbox Code Playgroud)

编辑

基于@Steven响应我现在有以下实现:

// UnityRepository implementation   
public class UnityRepository<TEntity> : Repository<TEntity, MyDbContextEntities>
        where TEntity : class
{
    public UnityRepository() : …
Run Code Online (Sandbox Code Playgroud)

entity-framework unity-container separation-of-concerns repository-pattern

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

Unity无法解决基本依赖关系链

我正在Unity IoC中实现动态加载和注册我的程序集.

鉴于这些类:

public interface IA { }
public interface IB { }
public interface IC { }

public class A : IA { }
public class B : IB
{
    public B(IA a) { }
}

public class C : IC
{
    public C(IB b) { }
}
Run Code Online (Sandbox Code Playgroud)

而这个配置:

var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
    AllClasses.FromAssemblies(assembly),
    WithMappings.FromAllInterfacesInSameAssembly,
    WithName.Default,
    WithLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)

代码:

var c = container.Resolve(typeof(IC));
Run Code Online (Sandbox Code Playgroud)

抛出:

Microsoft.Practices.Unity.dll中出现"Microsoft.Practices.Unity.ResolutionFailedException"类型的第一次机会异常

附加信息:依赖项的解析失败,type ="MyAsm.IC",name ="(none)".

在解决时发生异常:

例外情况是:InvalidOperationException - 类型IC没有可访问的构造函数.


在例外时,容器是:

MyAsm.IC,(无)

所有上述代码都在同一个程序集MyAsm中执行.在调试中分析容器,该Registrations属性列出了似乎正确的映射集合A, …

c# ioc-container unity-container

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

IoC - Unity,RegisterInstance如何工作,我是对的吗?

我正在实施Ioc,我想确保一些正确的事情.

  1. 如果我使用RegisterInstance,在解析它时将始终返回单例对象?
  2. BootStrapper将加载到Global.asax或最初将加载的某个地方,这意味着所有实例都将是单例?

但我想知道如何
1.每个解析创建一个单独的实例,PerResolve不能使用RegisterInstance,它只适用于RegisterType.
2.如果我将依赖对象作为静态属性,它将以相同的方式工作,如果我能够为每个解析创建单独的实例?

请帮忙?

public class ClientUser : UserServiceBase, IClientUser
{
    private  IDataServiceManager _dataServiceManager;
    public ClientUser()
    {

    }

    private IDataServiceManager DataServiceMgr
    {
        get
        {
            if (_dataServiceManager == null)
                _dataServiceManager = ProjectContainer.Instance.Resolve<IDataServiceManager>();

            return _dataServiceManager;
        }
    }    
Run Code Online (Sandbox Code Playgroud)

.net singleton ioc-container unity-container

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

尝试获取ICacheManager类型的实例时出现激活错误,键"缓存管理器"

我似乎在这里遇到了障碍,并希望得到任何能够在这一方面得到帮助的人.我不确定下面的错误消息是什么意思.我正在使用企业模式服务的缓存块,但我继续遇到下面的问题.我下载了最新版本,并尝试逐步解决这个问题,但我似乎无法解决确切的问题,我需要帮助.提前致谢

Test method WorldBank.Service.Business.UnitTest.TopicsManagerTest.Call_Children_out_of_schoolTest threw exception: 
Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type ICacheManager, key "Cache Manager" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager", name = "Cache Manager".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was:

  Resolving Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager,WuCache
 ---> System.InvalidOperationException: The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is …
Run Code Online (Sandbox Code Playgroud)

.net c# caching enterprise-library unity-container

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

使用Unity将依赖项注入自定义ActionFilter

目前,我有一个自定义ControllerFactory,我注入我的Unity容器:

在global.asax Application_Start()中:

var container = InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);
Run Code Online (Sandbox Code Playgroud)

在控制器工厂中,我将控制器设置为使用自定义ActionInvoker,如下所示:

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
    var controller = base.GetControllerInstance(requestContext, controllerType) as Controller;

    if (controller != null)
        controller.ActionInvoker = new UnityActionInvoker(_container);

    return controller;
}
Run Code Online (Sandbox Code Playgroud)

最后在我的自定义ActionInvoker中,我尝试使用ActionInvokers容器构建调用的操作:

protected override ActionExecutedContext InvokeActionMethodWithFilters(
        ControllerContext controllerContext,
        IList<IActionFilter> filters,
        ActionDescriptor actionDescriptor,
        IDictionary<string, object> parameters)
{
    var builtUpFilters = new List<IActionFilter>();

    foreach (IActionFilter actionFilter in filters)
    {
        builtUpFilters.Add(_container.BuildUp<IActionFilter>(actionFilter));
    }

    return base.InvokeActionMethodWithFilters(controllerContext, builtUpFilters, actionDescriptor, parameters);
}
Run Code Online (Sandbox Code Playgroud)

以下是正在构建的ActionFilters之一的示例:

public class PopulatRolesAttribute …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection unity-container asp.net-mvc-3

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