我在DI IOC的Web项目中使用StructureMap.它工作得很完美,但我不知道如何用StructureMap编写单元测试.
我应该在AssemblyInitialize中开始配置StructureMap,就像在global.asax中一样,除了datacontext不使用实时LinqToSqlDataContext但是有些内存数据如下:
[AssemblyInitialize]
public static void Start()
{
ObjectFactory.Configure(x =>
{
x.For<IDataContext>().HttpContextScoped().Use<MemoryDataContext>()
.Ctor<string>("connectionString")
.Is(ConfigurationManager.ConnectionStrings["DEVConnection"].ConnectionString);
x.For<IDepartamentRepository>().Use<DepartamentDB>();
x.For<IDevelopmentProcess>().Use<DevelopmentProcesses>().OnCreation(c => c.User = Current.CurrentUser);
x.For<IActivityProcess>().Use<ActivitiesProcess>().OnCreation(c=> c.User = Current.CurrentUser);
x.For<IDevDeveloperRepository>().Use<DevDeveloperDB>();
x.For<IDevelopmentRepository>().Use<DevelopmentDB>();
x.For<IActivityRepository>().Use<ActivityDB>();
x.For<IActivityTypeRepository>().Use<ActivityTypeDB>();
x.For<IDevUserRepository>().Use<DevUsersDB>();
x.For<IAttachmentRepository>().Use<AttachmentDB>();
}
);
}
Run Code Online (Sandbox Code Playgroud)
然后使用ObjectFactory.GetInstance()测试或我该怎么做?
我在结构图中有最简单的循环依赖 - 类A在其构造函数中依赖于类B,而类B在其构造函数中依赖于类A. 为了打破依赖,我让B类把A类作为属性,而不是构造函数参数,但是structmap仍然抱怨.
我已经看到在其他DI框架中使用此方法破坏了循环依赖 - 这是Structuremap的问题还是我做错了什么?
编辑: 我应该提到类B的属性是一个A类实例的数组,这样连线:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Run Code Online (Sandbox Code Playgroud)
为了澄清,我希望发生以下事件序列:
我希望所有这一切都发生在使用自动装配,如果可能的话......
编辑2:这是一个使用显式连线的简化示例:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
Run Code Online (Sandbox Code Playgroud)
验证配置会导致"使用RequestedType检测到双向依赖性问题:IocTest2.ILoader ..."
我有一个插件系统,允许用户选择他们想要创建的插件类型(基本上这为插件实例设置了配置).
他们从选择列表中选择插件类型.我正在使用StructureMap将IEnumerable注入我的MVC控制器,以便我可以访问要在选择列表中使用的FQ类型名称.
这工作正常但我不喜欢我必须创建所有已注册插件的实例只是为了在选择列表中显示它们的列表.
所以问题是,我可以访问在StructureMap 中注册的IPlugin类型吗?
我有一个有2个构造函数的类.
我的课()
和
MyClass(IMyService服务)
我怎么告诉StructureMap然后每当我做一个'new MyClass()'时它应该实际调用第二个构造函数而不是第一个构造函数.
请帮忙.
NHibernate 3.2/Fluent NHibernate 1.3/StructureMap 2.6.3 -
尝试将DDD作为架构策略,我通常不依赖于域实体.但是,我现在正在尝试向我的域实体添加更多行为,以便它们不会如此贫乏.一切顺利,直到我连接NHibernate.我有两个问题:
我一直在网上阅读,但我发现的大部分(如果不是全部)例子已经过时(或者只是旧版).虽然NH阵营可能不赞成我正在做的事情,但我正在寻找NH的方式来做到这一点.
我注意到当我从NuGet将StructMap安装到我的ASP.NET MVC3项目中时,Dave Ebbo的WebActivator包也被添加为依赖项.
WebActivator提供了一个PreApplicationStartMethod属性,并且在安装时添加的样板代码中,它用于在其自己的类中初始化IoC容器和依赖项解析器,而不是在内部Global.asax的Application_Start方法中执行此操作.
鉴于ASP.NET 4已经有了自己的System.Web.PreApplicationStartMethodAttribute原因,为什么WebActivator必须提供自己的版本,而StructureMap才能使用它?
我猜我不具备使用WebActivator的变种?
为Darin添加了代码:
using System.Web;
using System.Web.Mvc;
using StructureMap;
[assembly: WebActivator.PreApplicationStartMethod(
typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")]
// or
[assembly: PreApplicationStartMethod(
typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")]
namespace MyMvcApp.App_Start {
public static class StructuremapMvc {
public static void Start() {
var container = (IContainer) IoC.Initialize();
DependencyResolver.SetResolver(new SmDependencyResolver(container));
}
}
}
Run Code Online (Sandbox Code Playgroud) 当前版本的StructureMap是否支持ASP .Net Web API,MVC 4和.NET Framework 4.5?
.net structuremap dependency-injection ioc-container asp.net-web-api
在我的StructureMap引导代码中,我使用自定义约定来扫描程序集并将接口/实现对作为命名实例添加到对象图中.基本上我有一些逻辑可以检查配置设置,并根据不同的条件深入到这个语句:
registry.For(interfaceType).Use(type)
.Named(implementationName);
Run Code Online (Sandbox Code Playgroud)
这足以添加所有命名实例.但是,我还想在未指定实例名称的情况下添加默认实例.但是,默认实例并不总是添加到图表中的最后一个实例.有时在扫描期间会添加其他命名实例.但是,似乎最后添加的任何一个实例,无论它是否被命名,都始终是默认的.
我尝试了各种流畅的API组合,包括:
registry.For(interfaceType).Add(type);
Run Code Online (Sandbox Code Playgroud)
要么:
registry.For(interfaceType).Use(type);
Run Code Online (Sandbox Code Playgroud)
甚至一些标记为已弃用的.但最终的行为始终是最后一个是默认行为.因此,如果添加实现的顺序是这样的:
由此产生的行为是,当未指定名称时,"Mock"实现将用作默认值.调试进入AllInstances容器,我按以下顺序看到:
但是,从没有实例名称的容器调用时调试到日志记录语句会导致使用Mock实现.
有没有办法在对象图中添加默认实例,同时仍然能够在之后添加命名实例?
我按照这里的说明将webApi.HelpPage区域和视图添加到现有项目,该项目使用structureMap - 但是在访问/ Help url时:
StructureMap Exception Code: 202 No Default Instance defined for PluginFamily System.Web.Http.HttpRouteCollection, System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Run Code Online (Sandbox Code Playgroud)
所以我在structureMap配置上遗漏了一些东西:
ObjectFactory.Configure(x => x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AssembliesFromApplicationBaseDirectory();
scan.AddAllTypesOf<IHttpModule>();
scan.WithDefaultConventions();
}));
Run Code Online (Sandbox Code Playgroud)
任何人都可以指向一个structureMap新手正确的方向吗?
c# structuremap asp.net-mvc-4 asp.net-web-api asp.net-web-api-helppages
我在我的项目中使用asp.net标识并使用structuremap作为DI框架.问题是当我使用构造函数注入时,ApplicationUserManager没有配置它的所有成员,例如TokenProvider,...
这是我的ApplicationUserManager类:
public class ApplicationUserManager : UserManager<User, long>
{
public ApplicationUserManager(IUserStore<User, long> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<InsuranceManagementContext>()));
// Configure the application user manager
manager.UserValidator = new UserValidator<User, long>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
manager.PasswordValidator = new PasswordValidator
{
RequireDigit = true,
RequiredLength = 8,
RequireLowercase = false,
RequireNonLetterOrDigit = true,
RequireUppercase = false
};
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{ …Run Code Online (Sandbox Code Playgroud) structuremap asp.net-mvc dependency-injection asp.net-identity asp.net-identity-2