标签: ioc-container

统一解析同一类型的多个实例

我想做一个简单的多种类型注册解决方案(最终注入构造函数,但使用.Resolve来查看Unity是否能够执行此类操作.

在下面的每种情况下,Unity都会解析0应该解决的项目2.

是否有一些团结的转变可以打开2007年后的行为?还是我只是大失所想?

这是我的代码:

public interface IFoo {}
public class Foo1 : IFoo{}
public class Foo2 : IFoo{}

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();
        container.RegisterType<IFoo, Foo1>();
        container.RegisterType<IFoo, Foo2>();

        // container.Resolve<IEnumerable<IFoo>>();   returns 0
        // container.ResolveAll<IFoo>(); returns 0

        var foos = container.Resolve<IFoo[]>();
        Console.WriteLine(foos.Count());

        Console.ReadLine();

    }
}
Run Code Online (Sandbox Code Playgroud)

c# ioc-container unity-container

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

如何使用城堡windsor覆盖组件?

我想在给定的windsor容器中重新定义(默认)实现.那是OverWrite的用途吗?但不起作用.

container.Register(
                    Component.For<IServiceOperationAuthorization>()
                            .OverWrite()
                            .Instance(_authorization)
                    );
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

欢呼,拉尔斯

castle-windsor castle ioc-container inversion-of-control

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

Castle Windsor传递构造函数参数

我有一个带有一些属性的IAddress类.然后,我有一个实现此接口的具体类型.这个具体类型有几个我可以使用的不同构造函数.如何在运行时将参数值传递给其中一个构造函数?我无法使用配置文件,因为我将多次重复使用此具体类型,并且每次参数值都不同.

IWindsorContainer container = new WindsorContainer(new XmlInterpreter());
IAddress address = container.Resolve<IAddress>();


public interface IAddress
{
    string Address1 { get; set; }
    string Address2 { get; set; }
    string City { get; set; }
    string State { get; set; }
    string ZipCode { get; set; }
}


class TestAddress : IAddress
{

    private string _address1;
    private string _address2;
    private string _city;
    private string _countyName;
    private string _state;
    private string _zipCode;

    public string Address1
    {
        get { return _address1; }
        set { …
Run Code Online (Sandbox Code Playgroud)

dependency-injection castle-windsor ioc-container inversion-of-control

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

何时使用IOC容器?

我试图了解何时应该使用容器而不是手动注入依赖项.如果我有一个使用1-2接口的应用程序,并且每个接口只有1-2个具体实现,我会倾向于自己处理.

如果我有一个使用2-3个接口的小应用程序,每个接口有2-3个具体实现,我应该使用一个完整的容器吗?像这样简单的东西就足够了吗?

基本上我试图理解何时适合手动处理这些依赖关系,什么时候(或者如果)我应该使用像上面那样简单的东西,何时使用像Ninject,Windsor等的IOC容器....它可能不会适合在这样的事情上加上一个数字,但我怎么能告诉它是时候使用IOC容器了?

dependency-injection ioc-container inversion-of-control

16
推荐指数
1
解决办法
2748
查看次数

在没有指定接口的情况下在Windsor中注册组件是否可以?

在没有指定接口的情况下在Windsor中注册组件被认为是不好的形式吗?即

container.Register(Component.For<MyClass>().LifeStyle.Transient);
Run Code Online (Sandbox Code Playgroud)

而不是......

container.Register(Component.For<IMyClass>().ImplementedBy<MyClass>().LifeStyle.Transient);
Run Code Online (Sandbox Code Playgroud)

我理解编码到接口而不是具体实现的好处,但是我们发现我们现在有很多接口,其中许多接口都是实际上只有一个实现的类.

dependency-injection castle-windsor ioc-container

16
推荐指数
1
解决办法
6190
查看次数

是应该在代码或配置文件中配置Unity?

Microsoft的Unity依赖注入框架可以通过代码或通过应用程序配置文件(app.config)进行配置.

代码示例:

IUnityContainer container = new UnityContainer()
    .RegisterType<IInterface, ConcreteImplementation>();
Run Code Online (Sandbox Code Playgroud)

配置示例:

<unity>
    <containers>
        <container>
            <types>
                <type type="IInterface, MyAssembly"
                      mapTo="ConcreteImplementation, MyAssembly" />
Run Code Online (Sandbox Code Playgroud)

每种方法有哪些优点/缺点?我可以想到"用户可以轻松配置您的应用程序"的明显优势,以及"用户可以轻松破解您的应用程序"的明显缺点,但是有什么不那么明显吗?

configuration dependency-injection app-config ioc-container unity-container

16
推荐指数
2
解决办法
7387
查看次数

编写SOLID应用程序最有力的理由是什么?

最近我做了关于依赖注入和IoC(控制反转)容器的演示.我也在谈论SOLID原则.我认为没有SOLID,DI容器毫无意义.

我专注于几个论点.

  1. 可维护性
  2. 可扩展性
  3. 可测性

然而,当科技集团回复说他们没有看到与容器进行DI等等时,我有点失望

我承认演示文稿可能并不完美,并且消息没有传达.

任何人都可以告诉我如何让观众相信依赖注入是一件好事.如何说服他们改变他们对松散耦合类和组件的看法(我们也对此进行了一些争论)

DI的"杀手"论点是什么?

c# dependency-injection ioc-container solid-principles

16
推荐指数
0
解决办法
3212
查看次数

什么是构造函数解析顺序?

当存在多个构造函数时,Castle Windsor如何确定要解析的构造函数?

.net c# dependency-injection castle-windsor ioc-container

15
推荐指数
1
解决办法
2774
查看次数

Ninject 2.0 Constructor参数 - 如何设置默认构造函数何时出现?

我是IOC容器的新手并且学习Ninject.我使用的是从Github新下载的2.0版本.

我正在尝试在默认构造函数也存在时在构造函数上设置字符串参数.我一直在逐步完成Ninject源代码,但我对用于轻松查明我缺少的模式的模式不够熟悉.

这是我的测试控制台应用程序:

        static void Main(string[] args)
        {
        IKernel kernel = new StandardKernel();
        kernel.Bind<ITestClass>().To<TestClass>()
            .WithConstructorArgument("message", "Hello World!");

        var testClass = kernel.Get<ITestClass>();

        // Does not work either:
        //var testClass = kernel.Get<ITestClass>(new ConstructorArgument("message", "Hello World!"));

        testClass.DisplayMessage();
        Console.ReadLine();
        }
    }

public interface ITestClass
    {
    void DisplayMessage();
    }

public class TestClass : ITestClass
    {
    public TestClass()
        {
        this.message = "Wrong message :(";
        }

    private string message;
    public TestClass(string message)
        {
        this.message = message;
        }

    public void DisplayMessage()
        {
        Console.WriteLine(this.message);
        }
Run Code Online (Sandbox Code Playgroud)

代码在控制台上打印"错误信息:(".如果我删除了TestClass中的默认构造函数,我会得到"Hello World!".我在这里缺少什么?

澄清:我希望班级打印"Hello World!" …

c# constructor dependency-injection ninject ioc-container

15
推荐指数
1
解决办法
5008
查看次数

Simple Injector:使用基于其父级的构造函数参数注册类型

我目前正在从我的项目中删除Ninject,并转向使用Simple Injector,但有一件事我无法正常工作.

对于我的日志记录,在注册服务时,我之前能够将参数传递到我的日志记录类中

_kernel.Bind<ILogger>().To<Logger>()
    .WithConstructorArgument("name",
        x => x.Request.ParentContext.Request.Service.FullName);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种在Simple Injector中重新创建它的方法.到目前为止,我还有其他一切工作但是这个.我可以通过执行以下操作来使日志记录正常工作,尽管没有显示正确的记录器名称:

_container.Register<ILogger>(() => new Logger("test"));
Run Code Online (Sandbox Code Playgroud)

做任何类似事情的人都有经验吗?

c# dependency-injection ioc-container simple-injector

15
推荐指数
2
解决办法
6362
查看次数