这个问题是我之前提出的问题的后续问题:Autofac:隐藏一个复合背后的多个逆变实现.
我试图找到我们可以用Autofac的协方差和逆变支持做些什么的边界.我注意到Autofac ContravariantRegistrationSource只支持带有用in关键字标记的单个通用参数的通用接口.这似乎限制了这个功能的实用性,我想知道Autofac是否有其他方法来扩展协方差和逆变的支持.
我必须承认,由于我正在使用的是真正的应用程序设计,所以我不会问这个问题.为了教育,我故意试图找到Autofac的限制.
请考虑以下界面:
public interface IConverter<in TIn, out TOut>
{
TOut Convert(TIn value);
}
Run Code Online (Sandbox Code Playgroud)
以下实施:
public class ObjectToStringConverter : IConverter<object, string>
{
string IConverter<object, string>.Convert(object value)
{
return value.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
以下注册:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterType<ObjectToStringConverter>()
.As<IConverter<object, string>>();
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
通过这种设计和配置,我希望能够做到这一点:
// This call succeeds because IConverter<object, string> is
// explicitly registered.
container.Resolve<IConverter<object, string>>();
// This call fails, although IConverter<string, object> is
// assignable from IConverter<object, string>. …Run Code Online (Sandbox Code Playgroud) 有人可以建议我在Unity3D中运行一个好的,轻巧的c#IoC容器,而不依赖于服务定位器模式吗?谢谢!
我使用Unity作为我的IoC框架,我正在基于处理程序中每个请求的标头中的值创建一个类型:
var container = new UnityContainer();
container.RegisterType<IFoo,Foo>(new InjectionConstructor(valuefromHeader));
GlobalConfiguration.Configuration.DependencyResolver =
new Unity.WebApi.UnityDependencyResolver(container);
Run Code Online (Sandbox Code Playgroud)
问题是处理程序SendAsync意味着全局容器被不同的请求覆盖,并且在构造函数中使用IFoo的控制器得到错误的值.
1)我可以使SendAsync同步吗?2)如果没有,如何为每个请求创建不同的实例并让IoC容器安全解析?
我查看了以下文章但没有成功:
http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver http://www.strathweb.com/2012/11/asp-net-web-api -and-dependencies-in-request-scope/ http://benfoster.io/blog/per-request-dependencies-in-aspnet-web-api-using-structuremap
提前致谢.
我是Repository和DI的新手,并试图在我的MVC 5项目中实现.
我实现了构造函数注入,在我的控制器中有一个像这样的构造函数:
IBook _ibook;
public Test(IBook ibook)
{
_ibook = ibook;
}
Run Code Online (Sandbox Code Playgroud)
没有任何DI库,它会抛出一个错误:没有空构造函数.
为了避免这种情况,我又添加了一个构造函数,如下所示:
public Test ():this(new Book())
{
}
Run Code Online (Sandbox Code Playgroud)
由于我是DI的新手,我不想通过使用DI库冒险我的项目,后来可能会抛出一些我可能无法解决的错误.
我想知道如果我不使用DI库会遇到什么问题.
如果推荐,哪个DI库适合初学者?我见过很少有NInject和Unity的视频.
asp.net-mvc design-patterns dependency-injection ninject unity-container
我们一直在使用Simple Injector取得了很好的成功,在一个相当实际的应用程序中.我们一直在为所有生产类使用构造函数注入,并配置Simple Injector来填充所有内容,而且一切都很好.
但是,我们没有使用Simple Injector来管理单元测试的依赖树.相反,我们一直在手动创新.
我花了几天时间完成了一次重大的重构,几乎所有的时间都是在我们的单元测试中修复这些手动构造的依赖树.
这让我感到疑惑 - 是否有人使用任何模式来配置他们在单元测试中使用的依赖树?对我们来说,至少在我们的测试中,我们的依赖树往往相当简单,但有很多.
任何人都有他们用来管理这些的方法吗?
c# unit-testing dependency-injection ioc-container simple-injector
当我的应用程序启动时,我有一堆模块(module1,module2 ......).对于每个模块,我都有一堆控制器操作:
/myModuleController/module1/action1
/myModuleController/module1/action2
/myModuleController/module2/action1
/myModuleController/module2/action2
…
Run Code Online (Sandbox Code Playgroud)
由于用户可以为每个模块记录一次,我为每个模块部署一个身份验证中间件,这样就可以这样做:
app.UseWhen((context) => context.Request.Path.StartsWithSegments(urlPath), appbuilder =>
{
appbuilder.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieName = cookieName,
…
});
});
Run Code Online (Sandbox Code Playgroud)
所以基本上,在url路径上/myModuleController/module1我有一个中间件加上它的cookie,另一个用于/myModuleController/module2...它有点不寻常我想但它工作正常,我对这种行为很满意.
问题出在这里:我希望能够在运行时添加一个新模块,这意味着能够使用一段代码部署一个新的中间件app.UseWhen(url, app. UseCookieAuthentication(…)).我试着天真地注入IApplicationBuilder app负责添加模块的控制器,但我得到一个例外:
System.InvalidOperationException:尝试激活'AdminController'时无法解析类型'Microsoft.AspNetCore.Builder.IApplicationBuilder'的服务
我的问题是:它应该有效吗?我一定是在某个地方弄错了?或者,你是否清楚我在这里尝试的东西没有机会工作?
你怎么会达到同样的要求?谢谢.
您好我正在使用Simple Injector DI库并且已经关注了一些关于围绕命令模式设计的架构模型的非常有趣的材料:
容器将管理生命周期UnitOfWork,我使用命令来执行数据库的特定功能.
我的问题是,如果我有一个命令,例如一个AddNewCustomerCommand,它反过来执行另一个服务的另一个调用(即发送文本消息),从设计的角度来看这是可接受的还是应该在更高的层次上完成,如果是的话最好这样做?
示例代码如下:
public class AddNewBusinessUnitHandler
: ICommandHandler<AddBusinessUnitCommand>
{
private IUnitOfWork uow;
private ICommandHandler<OtherServiceCommand> otherHandler;
AddNewBusinessUnitHandler(IUnitOfWork uow,
ICommandHandler<OtherServiceCommand> otherHandler)
{
this.uow = uow;
this.otherHandler = otherHandler;
}
public void Handle(AddBusinessUnitCommand command)
{
var businessUnit = new BusinessUnit()
{
Name = command.BusinessUnitName,
Address = command.BusinessUnitAddress
};
var otherCommand = new OtherServiceCommand()
{
welcomePostTo = command.BusinessUnitName
};
uow.BusinessUnitRepository.Add(businessUnit);
this.otherHandler.Handle(otherCommand);
}
}
Run Code Online (Sandbox Code Playgroud) 我有多个服务,每个服务都UnitOfWork使用Simple Injector IoC容器注入构造函数.
目前我可以看到每个UnitOfWork实例都是一个单独的对象,这很糟糕,因为我使用的是Entity Framework,并且需要在所有工作单元中使用相同的上下文引用.
如何确保UnitOfWork每个解析请求将相同的实例注入到所有服务中?UnitOfWor命令完成后,我将由外部命令处理程序装饰器保存.
请注意,这是一个公共库,将用于MVC和Windows Forms,如果可能的话,为两个平台提供通用解决方案会很不错.
代码如下:
// snippet of code that registers types
void RegisterTypes()
{
// register general unit of work class for use by majority of service layers
container.Register<IUnitOfWork, UnitOfWork>();
// provide a factory for singleton classes to create their own units of work
// at will
container.RegisterSingle<IUnitOfWorkFactory, UnitOfWorkFactory>();
// register logger
container.RegisterSingle<ILogger, NLogForUnitOfWork>();
// register all generic command handlers
container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>),
AppDomain.CurrentDomain.GetAssemblies());
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(TransactionCommandHandlerDecorator<>));
// register …Run Code Online (Sandbox Code Playgroud) .net c# dependency-injection entity-framework-4 simple-injector
我正在使用Simple Injector依赖注入框架,它看起来很酷很好.但在构建配置并使用它之后,现在我想知道如何从一种配置更改为另一种配置.
场景:让我们想象一下我在Global Asax中设置了一个配置,我在Container那里有公共和全局实例.现在我想做一些测试,我希望他们使用模拟类,所以我想改变配置.
当然,我可以构建另一个配置并将其分配给Container默认创建的全局,这样每次运行测试时都会设置备用配置.但是在这样做的时候,尽管我处于开发环境中,但Container每个人都会改变,即使是正常的请求.我知道我正在测试这个环境,这应该不重要,但我觉得这不是这样做的方式......我想知道如何以正确的方式从一种配置转换到另一种配置.
c# dependency-injection inversion-of-control simple-injector
我目前正在使用Simple Injector来解析我的Asp.Net Web Api项目中的依赖项.
从文档中您可以像这样配置它:
protected void Application_Start() {
// Create the container as usual.
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
// Register your types, for instance using the scoped lifestyle:
container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Scoped);
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
// Here your usual Web API configuration stuff.
}
Run Code Online (Sandbox Code Playgroud)
这里的要点是注册Web Api控制器并设置自定义依赖项解析器.
但是,我刚刚阅读了Mark Seemann关于如何在Asp.Net Web Api中配置依赖注入的这些文章:
从这些文章中,我了解到有一个比IDependencyResolver解决Web Api依赖关系更好的选择.另一个选择是创建一个实现, …
c# ×8
.net ×2
architecture ×1
asp.net-core ×1
asp.net-mvc ×1
autofac ×1
covariance ×1
ninject ×1
unit-of-work ×1
unit-testing ×1