我正在使用StructureMap来解析对我的存储库类的引用.我的存储库接口实现了IDisposable,例如
public interface IMyRepository : IDisposable
{
SomeClass GetById(int id);
}
Run Code Online (Sandbox Code Playgroud)
使用Entity Framework实现接口:
public MyRepository : IMyRepository
{
private MyDbContext _dbContext;
public MyDbContext()
{
_dbContext = new MyDbContext();
}
public SomeClass GetById(int id)
{
var query = from x in _dbContext
where x.Id = id
select x;
return x.FirstOrDefault();
}
public void Dispose()
{
_dbContext.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何提到我正在使用StructureMap来解析IMyRepository.那么何时,何地以及如何调用我的处理方法?
我有一些工作经验Structuremap.现在我用大造和大型Web应用程序(一个真正的社交网站)ASP.NET MVC 3,Entity Framework 4.1 code-first,SqlServer 2008,通过C#.NET 4.哪一个Structuremap,AutoFac和Ninject你会建议我在这种情况下使用?性能和易用性很重要.感谢任何帮助,想法和建议.
有没有办法自动配置Automapper来扫描命名空间/程序集中的所有配置文件?我想要做的是从给定的程序集中过滤的给定程序集中将映射配置文件添加到AutoMapper,类似于StructureMap中的扫描约定:
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
// Scan Assembly
x.Scan(
scanner =>
{
scanner.TheCallingAssembly();
scanner.Convention<MyCustomConvention>();
scanner.WithDefaultConventions();
});
// Add Registries
x.AddRegistry(new SomeRegistry());
});
Debug.WriteLine(ObjectFactory.WhatDoIHave());
}
public class MyCustomConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (!type.CanBeCastTo(typeof(IMyType)))
{
return;
}
string name = type.Name.Replace("SomeRubishName", String.Empty);
registry.AddType(typeof(IMyType), type, name);
}
Run Code Online (Sandbox Code Playgroud)
我试过使用SelfConfigure但找不到任何关于如何使用它来过滤配置文件的文档:
public static void Configure()
{
Mapper.Initialize(x =>
{
// My Custom profile
x.AddProfile<MyMappingProfile>();
// Scan Assembly
x.SelfConfigure(Assembly.GetCallingAssembly());
});
}
Run Code Online (Sandbox Code Playgroud)
另一个问题是我如何报告已经初始化的所有地图/配置文件(类似于StructureMap中的ObjectFactory.WhatDoIHave())?
我有一个接口(IRepository<T>),目前正在为每个特定的存储库进行扩展,即:IUserRepository : IRepository<User>.
这些接口中的每一个都具有相应的具体类,即:UserRepository : Repository<User>, IUserRepository.
这些单独的存储库不添加任何其他功能,它们都是空接口/类,仅用于传递泛型.
我用StructureMap解决IUserRepository到UserRepository使用注册表与组装扫描仪和一些命名约定.
我希望这可以转向一种更优化的状态,而不是传递实例IUserRepository并将其解析UserRepository,我可以传递IRepository<User>并解决它Repository<User>.
这将消除创建这些额外的空接口和类的需要.
我无法找到一种方法来使用StructureMap的配置来设置这种通用映射.像这样的东西:
For(typeof(IRepository<>).Use(typeof(Repository<>)).WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter();
Run Code Online (Sandbox Code Playgroud)
编辑
得到前几个答案之后,我想再澄清一下这个问题.
我不想为For配置的位创建单独的类.我希望在我的代码中有以下类/接口:
IRepository<T> where T : EntityRepository<T> : IRepository<T> where T : EntityPerson : EntityProduct : EntityOrder : EntityWhatever : Entity并按照惯例实现以下映射:
IRepository<Person> => Repository<Person>
IRepository<Product> => Repository<Product>
IRepository<Order> => Repository<Order>
IRepository<Whatever> => Repository<Whatever>
Run Code Online (Sandbox Code Playgroud)
但我不想为每个人创建一个映射,ala:
For<IRepository<Person>>().Use<Repository<Person>>();
For<IRepository<Product>>().Use<Repository<Product>>();
For<IRepository<Order>>().Use<Repository<Order>>();
For<IRepository<Whatever>>().Use<Repository<Whatever>>(); …Run Code Online (Sandbox Code Playgroud) 我在我的MVC3应用程序中使用SignalR,并且因为我在我的控制器上实现了StructureMap依赖注入,我想在我的集线器中执行相同操作,但我似乎无法使其工作.
请告诉我下面的代码有什么问题:
SignalRSmDependencyResolver.cs
public class SignalRSmDependencyResolver : DefaultDependencyResolver
{
private IContainer _container;
public SignalRSmDependencyResolver(IContainer container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
object service = null;
if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
{
// Concrete type resolution
service = _container.GetInstance(serviceType);
}
else
{
// Other type resolution with base fallback
service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
}
return service;
}
public override IEnumerable<object> GetServices(Type serviceType)
{
var objects = _container.GetAllInstances(serviceType).Cast<object>();
objects.Concat(base.GetServices(serviceType));
return objects;
}
}
Run Code Online (Sandbox Code Playgroud)
SignalRExtensionsRegistry.cs
public …Run Code Online (Sandbox Code Playgroud) structuremap dependency-injection asp.net-mvc-3 signalr signalr-hub
我是StructureMap的新手.我已下载并使用的是2.6.1.0版.我一直收到以下错误:
StructureMap异常代码:202没有为PluginFamily Company.ProjectCore.Con.IConfiguration,Company.ProjectCore,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null定义的默认实例
我的Global.asax.cs看起来像:
protected void Application_Start(object sender, EventArgs e)
{
var container = new Container(x =>
{
x.For<ICache>().Use<Cache>();
x.For<IEmailService>().Use<EmailService>();
x.For<IUserSession>().Use<UserSession>();
x.For<IRedirector>().Use<Redirector>();
x.For<INavigation>().Use<Navigation>();
});
container.AssertConfigurationIsValid();
}
Run Code Online (Sandbox Code Playgroud)
我从ObjectFactory.Initialize更改为"new Container"进行调试.当单步执行AssertConfigurationIsValid()方法时,Cache可以工作,但EmailService在以下行中的GetInstance方法失败:
[Pluggable("Default")]
public class EmailService : IEmailService
private readonly IConfiguration _configuration;
public EmailService()
{
_configuration = ObjectFactory.GetInstance<IConfiguration>();
}
Run Code Online (Sandbox Code Playgroud)
如果我删除IEmailService,IUserSession会抛出相同的202错误.
我应该在Application_Start或我的类文件中添加其他内容吗?
提前致谢...
我试图使用StructureMap初始化我从ApiController派生的ValuesController,但我得到一个异常,说:
IControllerFactory'... CustomControllerFactory'没有返回名称'api'的控制器.
这是代码..
public class CustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return null;
return (Controller)ConcretizationsManager.GetInstance(controllerType);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上ConcretizationsManager是StructureMap的包装器.这个方法对于Controller类型的控制器总是运行正常,但是对于APIController不行.
有人让我走向正确的方向吗?很感谢
我正在开发一个ASP MVC 3应用程序,我正在编写一个自定义的html助手.它没有什么特别之处或非常复杂,但它需要一个来自结构图的接口实例.我知道我可以简单地从方法内部调用structuremaps的对象工厂,但由于应用程序的其余部分使用IoC而不是服务位置,我希望保持这种方式.
有没有办法从内部和asp net mvc app注入扩展方法的接口?
UPDATE
我正在做的一个例子可能会有所帮助:
public static class ShowUrl
{
public static string ForShow(this UrlHelper url, int showId)
{
var service = ObjectFactory.GetInstance<IPerformanceService>();
var showName = service.GetPerformanceTitle(showId);
return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl()));
}
}
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
<a href='<%= Url.ForShow(1)%>'>
Run Code Online (Sandbox Code Playgroud)
基本上我正在尝试使用来自实体ID的slug构建一个URL.也许我只是以一种非常愚蠢的方式来解决这个问题.
使用structuremap 2.6.4.1,我的容器配置如下:
existingContainer.Configure(expression =>
{
expression.For<IDocumentSession>()
.HybridHttpOrThreadLocalScoped()
.Use(container =>
{
var store = container.GetInstance<IDocumentStore>();
return store.OpenSession();
});
}
Run Code Online (Sandbox Code Playgroud)
HybridHttpOrThreadLocalScoped 在结构图3中不存在,所以我的问题是,structuremap 3中的等效配置是什么?
我在我的项目中使用Automapper 5.2.0.当我ProjectTo()在代码中使用时获取此错误:
Mapper未初始化.使用适当的配置调用Initialize.如果您正试图通过容器或以其它方式使用映射器实例,请确保您不必静态Mapper.Map方法的任何电话,如果你使用ProjectTo或UseAsDataSource扩展方法,确保你在适当的IConfigurationProvider通实例.
服务代码
public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
{
var id = Guid.Parse(_identity.GetUserId());
var model = await _freelancerProfiles
.AsNoTracking()
.Where(_ => _.User.Id == id)
.ProjectTo<FreelancerProfileViewModel>()
.FirstAsync();
// var viewmodel = _mapper.Map<FreelancerProfileViewModel>(model);
return model;
}
Run Code Online (Sandbox Code Playgroud)
自动映射配置文件
public class FreelancerDashbordProfile : Profile
{
private readonly IIdentity _identity;
public FreelancerDashbordProfile(IIdentity identity)
{
_identity = identity;
var id = Guid.Parse(_identity.GetUserId());
CreateMap<FreelancerProfile, FreelancerProfileViewModel>()
.ForMember(_ => _.DoingProjectCount,
__ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.Doing)))
.ForMember(_ => _.EndProjectCount,
__ => __.MapFrom(_ …Run Code Online (Sandbox Code Playgroud) structuremap ×10
c# ×4
.net ×2
asp.net ×2
asp.net-mvc ×1
autofac ×1
automapper ×1
automapper-5 ×1
dispose ×1
generics ×1
ninject ×1
profile ×1
signalr ×1
signalr-hub ×1