所以,我有一个使用StructureMap的.NET解决方案,我想让StructureMap读取一个外部程序集,该程序集实现该解决方案中项目的接口并为其定义注册表项.
我的解决方案的StructreMap配置:
ObjectFactory.Initialize(registry =>
{
registry.Scan(assembly =>
{
assembly.TheCallingAssembly();
//Telling StructureMap to sweep a folder called "extensions" directly
//underneath the application root folder for any assemblies found in that folder
assembly.AssembliesFromPath("extensions", addedAssembly => addedAssembly.GetName().Name.ToLower().Contains("extension"));
//Direct StructureMap to add any Registries that it finds in these assemblies, assuming that all the StructureMap directives are
//contained in registry classes
assembly.LookForRegistries();
});
});
Run Code Online (Sandbox Code Playgroud)
非常简单,我告诉它将调用程序集和程序集从目录添加到程序集集合中.我调试了程序集变量,它确实找到了所有程序集(包括扩展目录中的程序集).
在我创建的DLL项目中,我独立于原始解决方案,我有一个接口的实现(我从原始解决方案中引用了interfaces项目),并编写了一个非常简单的注册表:
public class ProductMockRegistry : Registry
{
public ProductMockRegistry()
{
ForRequestedType<IProductRepository>().AddInstances(repository =>
{
repository.OfConcreteType<ProductMockRepository>();
});
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,StructureMap没有在外部DLL中找到注册表.它发现DLL很好,但是当我告诉LookForRegistries时,它找不到它.
我正在寻找一些结构图教程.
有谁知道吗?
编辑:所有的答案都很受欢迎,但我正在寻找一些不在谷歌前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) 我目前正在使用StructureMap,通常使用基于约定的(Scan())自动配置,我希望将基于装饰器的缓存添加到管道中.
如果我手动配置它很好,但是当你获得大量依赖时Scan()它就是这么方便 ...我正在注意接口上的缓存建议,例如:
public interface IFoo {
[CacheDuration(20)] // cache for 20 minutes
string[] DoSomethingReusable();
SomeType DoSomethingNonReusable(int key); // not cached
}
Run Code Online (Sandbox Code Playgroud)
通过在StructureMap扫描中添加自定义"约定" (非常简单),它可以发现一个或多个方法被装饰用于缓存,并自动将生成的缓存装饰器注入到该类型的管道中(生成缓存)来自接口/方法名称和参数值的键).
从好的方面来说,它增加了缓存非常无痛 - 只需稍微装饰一下界面; 但是代码味道是什么?和/或我是否重复了已经解决的问题?
我在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
我有一个接口IGenericRepository<TEntity> where TEntity : IEntity和一个实现GenericRepository<TEntity> where TEntity : Entity.
我正在尝试IGenericRepository<Section>使用StructureMap 将特定注入到类中:
ObjectFactory.Initialize(x =>
{
x.For(typeof(IGenericRepository<>)).Use(typeof(GenericRepository<>));
});
Run Code Online (Sandbox Code Playgroud)
但当我尝试使用时,ObjectFactory.GetInstance<IGenericRepository<Section>>();我得到:
StructureMap异常代码:202没有为PluginFamily System.Data.Common.DbConnection定义的默认实例
任何想法为什么这是或我做错了什么?
提前致谢,
西蒙
这里已经提到了这个问题的一部分:structuremap属性注入,但从未给出答案.
使用StructureMap,可以进行Property Injection
class SomeController : Controller
{
public IService Service
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
注射得当吗?我是一个
我对Structuremap完全不熟悉,并且对如何连接具有多个实现的接口感到困惑.
让我们说我有Controller1和Controller2.我有Interface1两个单独的类实现,Class1ForInterface1和Class2ForInterface1.在Controller1我想要Class1ForInterFace1注射和Controller2我想要Class2ForInterface1注射.
如何使用structuremap连接它?看来我只能有一个接口到具体类型的映射?
谢谢!
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
.net ×3
c# ×3
aop ×1
asp.net-mvc ×1
assemblies ×1
generics ×1
poco ×1
registry ×1
vb.net ×1