标签: unity-container

MVC/Unity - 如何将依赖项注入自定义FilterAttributes?

我有一个HandleErrorAttribute延伸的习惯FilterAttribute.

如何在注入控制器的依赖项本身的同时将Unity注入依赖项注入此属性?

asp.net-mvc unity-container filterattribute

7
推荐指数
1
解决办法
2099
查看次数

如何调试Unity容器"Resolve"?

我正在使用MS Unity容器进行依赖注入,但"Resolve"正在返回意外结果.

有没有办法可以调试这个分辨率?如果我可以查看容器中注册的类型/实例,那将会很棒,但是在使用QuickWatch时我无法看到它存储在何处.如果我可以让容器输出一些调试跟踪也会很有用.

有什么建议?

inversion-of-control unity-container

7
推荐指数
1
解决办法
2740
查看次数

Unity容器:使用PerResolveLifetimeManager和自定义拦截

我在尝试使用Unity容器时实现自己的拦截.我希望以尊重所使用的终身经理的方式这样做.即如果它是一个PerResolveLifetimeManager,那么我想包装实例一次,我希望在整个解析过程中使用该包装实例.

到目前为止,我实现了一个BuilderStrategy,我使用自定义UnityContainerExtension类添加到我的容器中(我将PostInitialization传递给AddNew方法;我不确定最合适的值是什么,但这似乎有效).在我的BuilderStrategy中的PostBuildUp覆盖中,我将context.Existing替换为我的包装值.

当我在PerResolve生命周期中使用它时,会发生一次换行,但只有第一次使用依赖项才能获得包装的实例,其余的则获得一个非包装的实例.即如果我的ctor接收IFoo foo1和IFoo foo2那么只有foo1是我的包装实例,而foo2是未包装的实例.

这是一个示例repro(为简单起见,我使用另一个类的实例,Foo2,而不是包装):

public class MyInterception : UnityContainerExtension
{
    protected override void Initialize()
    {
        Context.Strategies.AddNew<MyInterceptionStrategy>(UnityBuildStage.PostInitialization);
    }
}

public class MyInterceptionStrategy : BuilderStrategy
{
    public override void PostBuildUp(IBuilderContext context)
    {
        if (!context.OriginalBuildKey.Type.IsInterface)
        {
            return;
        }

        context.Existing = new Foo2();
    }
}

public class Bar
{
    public Bar(IFoo f1, IFoo f2, IFoo f3)
    {
    }
}

public interface IFoo
{
}

public class Foo1 : IFoo
{
}

public class Foo2 : IFoo
{
}

public void Main()
{ …
Run Code Online (Sandbox Code Playgroud)

c# unity-container

7
推荐指数
1
解决办法
2467
查看次数

Castle Windsor Typed Factory Facility等同物

任何其他.NET IoC容器都能为Castle Windsor的类型化工厂提供相同的功能吗?

例如,如果我在WPF应用程序中使用抽象工厂模式:

public class MyViewModel
{
   private IAnotherViewModelFactory factory;

   public void ShowAnotherViewModel()
   {
      viewController.ShowView(factory.GetAnotherViewModel());
   }
}
Run Code Online (Sandbox Code Playgroud)

我不想为我希望展示的每种类型的ViewModel创建IAnotherViewModelFactory的手动实现,我希望容器能够为我处理这个问题.

castle-windsor ninject unity-container autofac abstract-factory

7
推荐指数
1
解决办法
1961
查看次数

在C#中调用超级构造函数

我有一些类,如AccountsController,ProductsController等,都继承自BaseController.Unity根据需要设置我的服务.这些类也都需要_sequence服务.因为它是所有类的常见要求,我想在BaseController中对此进行编码.

public class AccountsController : BaseController
{
    public AccountsController(
        IService<Account> accountService) {
        _account = accountService;
    }

public class ProductsController : BaseController
{
    public ProductsController(
        IService<Account> productService) {
        _product = productService;
    }


public class BaseController : Controller
{
    public IService<Account> _account;
    public IService<Product> _product;
    protected ISequenceService _sequence;

    public BaseController(
        ISequenceService sequenceService) {
        _sequence = sequenceService;
    }
Run Code Online (Sandbox Code Playgroud)

但是我怎么能这样做呢?我应该在每个AccountsController和ProductsController的构造函数中设置对BaseController的调用吗?

c# asp.net-mvc unity-container

7
推荐指数
1
解决办法
9596
查看次数

Unity:无法从不同的程序集注册类型

我正在尝试Dependency injection在我的MVC应用程序中实现.我正在使用Unity.Mvc3.dllIoC.我只是想知道Unity如何不能从另一个程序集中注册类型.这是代码:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    var container = new UnityContainer();

    // ok: register type from this assembly
    container.RegisterType<IMessages, Messages>();

    // fail: register type from another assembly (service reference)
    container.RegisterType<IPlayerService, PlayerService>();

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        this._container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public IEnumerable<object> GetServices(Type …
Run Code Online (Sandbox Code Playgroud)

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

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

如何用Unity引导AutoMapper?

我需要使用Unity我的DI容器并想要引导AutoMapper.

使用StructureMap我可以这样做;

For<IMappingEngine>().Use(() => Mapper.Engine);
Run Code Online (Sandbox Code Playgroud)

我该怎么办Unity

我已经使用包管理器来获取当前最新版本的AutoMapper2.2.1-ci9000,但在更简单的情况下也可以使用2.2.0.我使用的是2.1.505.0版Microsoft.Practices.Unity.

dependency-injection ioc-container unity-container automapper

7
推荐指数
1
解决办法
2547
查看次数

用于两次注册相同类型并仅解析单例的Unity行为

我一直在玩Unity以了解它,并遇到了以下情况.如果我要两次注册相同类型,但是一个是单例,我怎么调用Resolve才能返回单例?我知道这可以使用一个独特的Name,但我想知道如果没有这个可以完成.

例如:

_container.RegisterType<Music>(new InjectionConstructor(new Album("Non-singleton", "Non-singleton")));
_container.RegisterType<Music>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

并打电话

var music = Factory.Resolve<Music>();
Run Code Online (Sandbox Code Playgroud)

返回'Non-singleton'对象.起初,我认为这是基于注册顺序,但切换我仍然收到'非单例'实例.

是否有一个原因?有没有办法Resolve只在同一容器中的两个注册对象的单例类型w/out指定Name属性?

.net c# dependency-injection inversion-of-control unity-container

7
推荐指数
1
解决办法
7203
查看次数

WPF和Unity - 在类型上找不到匹配的构造函数

我想在使用VS2012的WPF应用程序中使用Unity,我将Unity容器定义如下:

IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<IMainViewModel, MainViewModel>();
var window = unityContainer.Resolve<MainWindow>();
window.Show();
Run Code Online (Sandbox Code Playgroud)

我的窗口构造函数如下所示:

public MainWindow(IMainViewModel mainViewModel)
       {
            InitializeComponent();
            this.DataContext = mainViewModel;
        }
Run Code Online (Sandbox Code Playgroud)

当我运行该应用程序时,我收到以下错误:

PresentationFramework.dll中发生未处理的"System.Windows.Markup.XamlParseException"类型异常

附加信息:'类型'WPFClient.MainWindow'上找不到匹配的构造函数.您可以使用Arguments或FactoryMethod指令来构造此类型.行号"3"和行位置"9".

我究竟做错了什么?

c# wpf unity-container

7
推荐指数
1
解决办法
4896
查看次数

如何在C#中注入一个类(不是接口)?

我在这里使用Unity.但可能我们只需指向一个正确的方向.

我们知道如何注入接口:

public class AccountController:ApiController
{
    private readonly IAccountRepository _repository;

    public AccountController(IAccountRepository repository)
    {
        _repository = repository;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用RegisterType

var container = new UnityContainer();
container.RegisterType<IAccountRepository, AccountRepository>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

但是在我的AccountRepository中,我们将一个类注入到构造函数中.

private readonly ApplicationUserManager _userManager;
public AccountRepository(ApplicationUserManager userManager)
{
    _userManager = userManager;
}
Run Code Online (Sandbox Code Playgroud)

因此,在调用ApiController时,我仍然会收到此错误:

尝试创建"AccountController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.

堆栈跟踪:

System.Web.Http.Detpatcher.DefaultHttpControllerActivator.GetInstanceOrActivator上的System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)中的System.Linq.Expressions.Expression.New(Type type)(HttpRequestMessage请求,类型System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)中的controllerType,Func`1和activator)

由于我已经创建了一些其他工作正常的ApiControllers,我想这一定是因为我们的ApplicationUserManager无法解析.

这里ApplicationUserManager继承自UserManager而不是接口.我不能用container.RegisterType<interface, derived_class>.解决问题的正确方法是什么?


这是ApplicationUserManager:

public class ApplicationUserManager : UserManager<User>
{
    public ApplicationUserManager(IdentityContext identityContext)
        : base(new UserStore<User>(identityContext)) …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection unity-container

7
推荐指数
1
解决办法
5018
查看次数