我想做一个简单的多种类型注册解决方案(最终注入构造函数,但使用.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) 我想在给定的windsor容器中重新定义(默认)实现.那是OverWrite的用途吗?但不起作用.
container.Register(
Component.For<IServiceOperationAuthorization>()
.OverWrite()
.Instance(_authorization)
);
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
欢呼,拉尔斯
我有一个带有一些属性的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
我试图了解何时应该使用容器而不是手动注入依赖项.如果我有一个使用1-2接口的应用程序,并且每个接口只有1-2个具体实现,我会倾向于自己处理.
如果我有一个使用2-3个接口的小应用程序,每个接口有2-3个具体实现,我应该使用一个完整的容器吗?像这样简单的东西就足够了吗?
基本上我试图理解何时适合手动处理这些依赖关系,什么时候(或者如果)我应该使用像上面那样简单的东西,何时使用像Ninject,Windsor等的IOC容器....它可能不会适合在这样的事情上加上一个数字,但我怎么能告诉它是时候使用IOC容器了?
在没有指定接口的情况下在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)
我理解编码到接口而不是具体实现的好处,但是我们发现我们现在有很多接口,其中许多接口都是实际上只有一个实现的类.
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
最近我做了关于依赖注入和IoC(控制反转)容器的演示.我也在谈论SOLID原则.我认为没有SOLID,DI容器毫无意义.
我专注于几个论点.
然而,当科技集团回复说他们没有看到与容器进行DI等等时,我有点失望
我承认演示文稿可能并不完美,并且消息没有传达.
任何人都可以告诉我如何让观众相信依赖注入是一件好事.如何说服他们改变他们对松散耦合类和组件的看法(我们也对此进行了一些争论)
DI的"杀手"论点是什么?
当存在多个构造函数时,Castle Windsor如何确定要解析的构造函数?
我是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!" …
我目前正在从我的项目中删除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)
做任何类似事情的人都有经验吗?