我有一个通用接口,IValidator.我希望能够使用StructureMap来检索为给定类型T实现IValidator的所有类的列表.例如,
var PersonValidators = ObjectFactory.GetAllInstances<IValidator<Person>>();
var AddressValidators = ObjectFactory.GetAllInstances<IValidator<Address>>();
Run Code Online (Sandbox Code Playgroud)
我知道如何检索实现IValidator的所有类,但我需要通过type参数的类型对其进行过滤.
任何人都可以给我任何指导或建议吗?
谢谢.
我有一个插件系统,允许用户选择他们想要创建的插件类型(基本上这为插件实例设置了配置).
他们从选择列表中选择插件类型.我正在使用StructureMap将IEnumerable注入我的MVC控制器,以便我可以访问要在选择列表中使用的FQ类型名称.
这工作正常但我不喜欢我必须创建所有已注册插件的实例只是为了在选择列表中显示它们的列表.
所以问题是,我可以访问在StructureMap 中注册的IPlugin类型吗?
在Windows服务中执行后台任务时,我用于HybridHttpOrThreadLocalScoped存储NHibernate ISessions的内容.
由于在Windows Server中没有HTTPContext,我想知道是否只调用ReleaseAndDisposeAllHttpScopedObjects()它足以释放该线程的ISession实例?
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) 我正在寻找一些结构图教程.
有谁知道吗?
编辑:所有的答案都很受欢迎,但我正在寻找一些不在谷歌前2页的东西.我有理由先做到这一点.
我正在使用MVVM模式构建WPF应用程序.我们的堆栈看起来像这样:
SQL Server 2008 - >实体框架
我们使用StructureMap进行依赖注入,以注入我们的DataFactory,它基本上为我们的POCO业务对象执行CRUD.
ViewModels使用DataFactory进行CRUD,xaml是绑定到POCO中属性的数据.
整件事情很有效,但我发现有点烦恼的是数据工厂.我们将每个属性从EF对象复制到选择时的POCO和更新/插入的反向.
有没有办法自动化这个过程,就像Fluent为NHibernate做的那样,但是使用Entity Framework?
以下是数据工厂中的示例插入方法:
public void InsertCustomer(ref Manager.Model.Customer businessObject)
{
var mgr = new Manager.Data.PersonData.PersonContext();
var person = new Manager.Data.PersonData.Person();
var customer = new Manager.Data.PersonData.Customer();
customer.Comments = businessObject.Comments;
customer.Company = businessObject.Company;
customer.IsBusiness = businessObject.IsBusiness;
customer.IsCompleted = businessObject.IsCompleted;
customer.ModifiedBy = "someone";
customer.ModifiedOn = DateTime.Now;
customer.CreatedBy = "someone";
customer.CreatedOn = DateTime.Now;
person.Customer.Add(customer);
person.FirstName = businessObject.FirstName;
person.LastName = businessObject.LastName;
person.Birthday = businessObject.Birthday;
person.CreatedBy = "someone";
person.CreatedOn = DateTime.Now;
person.Gender = businessObject.Gender;
person.MiddleInitial = businessObject.MiddleInitial;
person.ModifiedBy …Run Code Online (Sandbox Code Playgroud) 我的Web应用程序在业务逻辑和表示逻辑上有一些细微的变化,具体取决于登录用户的类型.看起来通过根据用户类型注入不同的具体类来获得变化非常适合DI.所以我想知道我应该使用StructureMap的哪些功能来实现这一目标(或者如果我基于DI的目的而离开).
(我刚刚了解到配置文件不是实现此目的的方法,因为设置配置文件不是每线程操作:StructureMap配置文件线程安全吗?)
这是怎么回事?
public class HomeController
{
private ISomeDependancy _someDependancy;
public HomeController(ISomeDependancy someDependancy)
{
_someDependancy = someDependancy;
}
public string GetNameFromDependancy()
{
return _someDependancy.GetName();
}
}
public interface ISomeDependancy
{
string GetName();
}
public class VersionASomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version A";
}
}
public class VersionBSomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version B";
}
}
public class VersionARegistry : Registry
{
public VersionARegistry() …Run Code Online (Sandbox Code Playgroud) 我在VB.Net环境中工作,最近的任务是创建一个MVC环境,作为工作的基础.我决定将最新的SharpArchitecture版本(2009年第3季度)转换为VB,总体来说,经过一些头发拉动后,它已经很好了.我遇到了Castle Windsor的一个问题,我的自定义存储库接口(位于核心/域项目中)在我的测试控制器的构造函数中引用了没有注入具体实现(来自数据项目).我用这个打了一堵砖墙,所以基本上决定把Castle Windsor换成StructureMap.
我认为我已经实现了这一点,因为一切都编译并运行,并且我的控制器在引用自定义存储库接口时运行正常.现在看起来我已经/或者现在无法正确设置我的通用接口(我希望这对我所有这些都是新的有意义).当我在控制器构造函数中使用IRepository(Of T)(希望它注入Repository(Of Type)的具体实现)时,我收到以下运行时错误:
"StructureMap异常代码:202没有为PluginFamily定义的默认实例SharpArch.Core.PersistenceSupport.IRepository`1 [[DebtRemedy.Core.Page,DebtRemedy.Core,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],SharpArch .Core,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = b5f559ae0ac4e006"
以下是我正在使用的代码摘录(我的项目名为DebtRemedy).
我的structuremap注册表类
Public Class DefaultRegistry
Inherits Registry
Public Sub New()
''//Generic Repositories
AddGenericRepositories()
''//Custom Repositories
AddCustomRepositories()
''//Application Services
AddApplicationServices()
''//Validator
[For](GetType(IValidator)).Use(GetType(Validator))
End Sub
Private Sub AddGenericRepositories()
''//ForRequestedType(GetType(IRepository(Of ))).TheDefaultIsConcreteType(GetType(Repository(Of )))
[For](GetType(IEntityDuplicateChecker)).Use(GetType(EntityDuplicateChecker))
[For](GetType(IRepository(Of ))).Use(GetType(Repository(Of )))
[For](GetType(INHibernateRepository(Of ))).Use(GetType(NHibernateRepository(Of )))
[For](GetType(IRepositoryWithTypedId(Of ,))).Use(GetType(RepositoryWithTypedId(Of ,)))
[For](GetType(INHibernateRepositoryWithTypedId(Of ,))).Use(GetType(NHibernateRepositoryWithTypedId(Of ,)))
End Sub
Private Sub AddCustomRepositories()
Scan(AddressOf SetupCustomRepositories)
End Sub
Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
y.Assembly("DebtRemedy.Core") …Run Code Online (Sandbox Code Playgroud) vb.net structuremap asp.net-mvc ioc-container s#arp-architecture
Unity如何获取接口的所有实例然后访问它们?
代码片段取自此处:Fail-Tracker
在StrcutureMap中,可以从程序集中注册所有类型的接口,然后访问它们,如下所示:
public class TaskRegistry : Registry
{
public TaskRegistry()
{
Scan(scan =>
{
scan.AssembliesFromApplicationBaseDirectory(
a => a.FullName.StartsWith("FailTracker"));
scan.AddAllTypesOf<IRunAtInit>();
scan.AddAllTypesOf<IRunAtStartup>();
scan.AddAllTypesOf<IRunOnEachRequest>();
scan.AddAllTypesOf<IRunOnError>();
scan.AddAllTypesOf<IRunAfterEachRequest>();
});
}
}
ObjectFactory.Configure(cfg =>
{
cfg.AddRegistry(new TaskRegistry());
});
Run Code Online (Sandbox Code Playgroud)
然后访问实现这些接口的所有类型,如:
using (var container = ObjectFactory.Container.GetNestedContainer())
{
foreach (var task in container.GetAllInstances<IRunAtInit>())
{
task.Execute();
}
foreach (var task in container.GetAllInstances<IRunAtStartup>())
{
task.Execute();
}
}
Run Code Online (Sandbox Code Playgroud)
这个代码在统一中的等价物是什么?
我如何在Application_BeginRequest中获得这些结构图
public void Application_BeginRequest()
{
Container = ObjectFactory.Container.GetNestedContainer();
foreach (var task in Container.GetAllInstances<IRunOnEachRequest>())
{
task.Execute();
}
}
Run Code Online (Sandbox Code Playgroud) structuremap ×10
c# ×4
.net ×2
asp.net ×2
asp.net-mvc ×2
nhibernate ×2
generics ×1
poco ×1
vb.net ×1