我试图让Unity管理我的对象的创建,我希望有一些在运行时才知道的初始化参数:
目前,我能想到的方法是在接口上使用Init方法.
interface IMyIntf {
void Initialize(string runTimeParam);
string RunTimeParam { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后使用它(在Unity中)我会这样做:
var IMyIntf = unityContainer.Resolve<IMyIntf>();
IMyIntf.Initialize("somevalue");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,runTimeParamparam是在运行时根据用户输入确定的.这里的简单案例只返回值,runTimeParam但实际上参数将类似于文件名,初始化方法将对文件执行某些操作.
这会产生许多问题,即该Initialize方法在界面上可用并且可以多次调用.在实现中设置一个标志并在重复调用时抛出异常Initialize似乎很笨重.
在解析我的界面时,我不想知道有关实现的任何信息IMyIntf.但是,我想要的是知道这个接口需要一定的一次初始化参数.有没有办法以某种方式注释(属性?)具有此信息的接口,并在创建对象时将它们传递给框架?
编辑:更多地描述了界面.
interface-design dependency-injection ioc-container inversion-of-control unity-container
在一些情况下,我最常使用"混蛋注射".当我有一个"适当的"依赖注入构造函数时:
public class ThingMaker {
...
public ThingMaker(IThingSource source){
_source = source;
}
Run Code Online (Sandbox Code Playgroud)
但是,对于我打算作为公共API(其他开发团队将使用的类)的类,我永远找不到比编写具有最可能需要的依赖项的默认"bastard"构造函数更好的选择:
public ThingMaker() : this(new DefaultThingSource()) {}
...
}
Run Code Online (Sandbox Code Playgroud)
这里明显的缺点是,这会对DefaultThingSource产生静态依赖; 理想情况下,没有这种依赖性,消费者总是会注入他们想要的任何IThingSource.但是,这太难用了; 消费者希望新建一个ThingMaker并开始制作物品,然后几个月后,在需要时注入其他东西.在我看来,这只留下了几个选项:
男孩,#3肯定看起来很有吸引力.还有另一种更好的选择吗?#1或#2似乎不值得.
我的应用程序中将包含以下组件
我希望使用Castle Windsor作为IoC来粘合各层,但我对胶合的设计有点不确定.
我的问题是谁应该负责将物品注册到温莎?我有几个想法;
有人可以用不同的途径帮助我提出一些想法和利弊吗?以这种方式利用Castle Windsor的示例项目的链接将非常有用.
在阅读Mark Seemann的".NET中的依赖注入"后,我远离服务定位器,这是一种反模式.
在阅读MVC 4上的发行说明后,我看到:
通过DependencyResolver改进了控制反转(IoC):Web API现在使用MVC依赖解析器实现的服务定位器模式来获取许多不同设施的实例.
因此,我对于微软在2012年使用服务定位器的原因感到好奇和困惑.
dependency-injection ioc-container service-locator asp.net-mvc-4
我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;
我的问题基本上是我应该使用Ninject 2做IoC,考虑到......
我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:
有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......
谢谢!
给定一个带有几个构造函数的类 - 如何告诉Resolve使用哪个构造函数?
请考虑以下示例类:
public class Foo
{
public Foo() { }
public Foo(IBar bar)
{
Bar = bar;
}
public Foo(string name, IBar bar)
{
Bar = bar;
Name = name;
}
public IBar Bar { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我想使用Resolve创建一个Foo类型的对象,Resolve将如何知道要使用哪个构造函数?我怎么能告诉它使用正确的呢?假设我有一个注册了IBar的容器 - 它会理解它应该支持构建者采用IBar吗?如果我也指定了一个字符串 - 它会使用(string, IBar)构造函数吗?
Foo foo = unityContainer.Resolve<Foo>();
Run Code Online (Sandbox Code Playgroud)
请忽略这样一个事实:如果类只有一个构造函数可能会更容易...
我只是想知道,因为密封关键字的存在表明它是类作者关于是否允许其他类继承它的决定,为什么默认情况下没有类密封,有一些关键字将它们显式标记为可扩展?
我知道它有些不同,但访问修饰符以这种方式工作.默认情况下是限制性的,只有通过插入关键字才能获得更全面的访问权限.
尽管如此,我很有可能没有想到这一点,所以请保持人性化!
我试图了解何时应该使用容器而不是手动注入依赖项.如果我有一个使用1-2接口的应用程序,并且每个接口只有1-2个具体实现,我会倾向于自己处理.
如果我有一个使用2-3个接口的小应用程序,每个接口有2-3个具体实现,我应该使用一个完整的容器吗?像这样简单的东西就足够了吗?
基本上我试图理解何时适合手动处理这些依赖关系,什么时候(或者如果)我应该使用像上面那样简单的东西,何时使用像Ninject,Windsor等的IOC容器....它可能不会适合在这样的事情上加上一个数字,但我怎么能告诉它是时候使用IOC容器了?
我有以下实现:
private INewsRepository newsRepository;
public NewsService(INewsRepository newsRepository)
{
this.newsRepository = newsRepository;
}
Run Code Online (Sandbox Code Playgroud)
此服务位于与我的Web项目不同的项目中.在哪里以及如何指定依赖注入?我还需要把它放在我的global.asax文件中吗?如果此服务也用于我的其他应用程序怎么办?
c# dependency-injection ioc-container inversion-of-control autofac
我最近使用依赖注入模式和Autofac作为IoC容器.
通常,我会在核心应用程序(Winform,WCF,WPF等)中使用它.
目前我正在学习创建一个类库项目作为我的同行开发人员的框架,我倾向于坚持DI模式,因为它允许我进行单元测试.
如何在没有入口点的类库项目中配置IoC容器?
我应该做的事情如下:
public static void ConfigureLibrary() {
//.. Do bootstraping here
}
Run Code Online (Sandbox Code Playgroud)
并让核心应用程序在核心应用程序启动时调用它?
如何配置模式和实践企业库或Spring.Net的库?
.net c# dependency-injection class-library inversion-of-control
c# ×5
.net ×3
asp.net-mvc ×1
autofac ×1
constructor ×1
inheritance ×1
ninject ×1
oop ×1
resolve ×1
sealed ×1