Unity中的StructureMap是否相同:
ServiceLocator.Current.GetAllInstances<IT>
Run Code Online (Sandbox Code Playgroud)
试图遵循这个小模式......
我使用带有MVVM模式和Prism的WPF开发了一个应用程序.视图将添加到ModuleCatalog中,并且视图模型将注册到统一容器.为此,我正在使用一个负责创建shell的Bootstrapper,配置统一容器和模块目录.
现在的问题是,如何将我的EntityContext注入到几个视图模型中.
首先是Bootstrapper:
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
Shell shell = Container.Resolve();
shell.Show();
return shell;
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType<EntityContext >("Context");
Container.RegisterType<PersonViewModel>(new InjectionConstructor(
new ResolvedParameter<EntityContext >("Context")));
}
protected override IModuleCatalog GetModuleCatalog()
{
ModuleCatalog catalog = new ModuleCatalog();
catalog.AddModule(typeof(PersonModule));
return catalog;
}
Run Code Online (Sandbox Code Playgroud)
viewmodel看起来像那样(摘录)
public class PersonViewModel : ViewModelBase, IDataErrorInfo
{
private Person _person;
private PersonRepository _repository;
readonly EntityContext _context;
public PersonViewModel(EntityContext context)
{
_context = context;
_person = new Person();
_repository = …
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Run Code Online (Sandbox Code Playgroud) c# dependency-injection unity-container mvvm entity-framework-4
我正在尝试执行以下操作并失败:
class base {}
class derived1 : base {}
class derived2 : base {}
interface itr<t>
where t : class, base
{}
class c1: itr<derived1>
{}
class c2 : itr<derived2>
{}
Run Code Online (Sandbox Code Playgroud)
//以下2个注册失败:
_unityContainer.RegisterType<itr<base>, c1>("c1");
_unityContainer.RegisterType<itr<base>, c2>("c2");
Run Code Online (Sandbox Code Playgroud)
我得到的错误是上述注册中的第二个参数不能被类型转换为第一个参数,并且该注册无效.有关如何做到这一点的任何建议?
我需要执行上述操作,而不是使用derived1或derived2类作为通用参数进行注册,因为在解析时我不想知道我正在解析的确切派生类型.我只想多态地使用基类型方法.
有可能像这样使用统一:
container.Register(typeof(IMyType<car>), typeof(MyType1<car>));
container.Register(typeof(IMyType<>), typeof(MyType2<>));
Run Code Online (Sandbox Code Playgroud)
..所以,当我试图解决时,IMyType<car>我得到了MyType1<car>......但是当我试着解决时,IMyType<bus>我得到了MyType2<bus>?或者也许是另一种方法来做同样的事情,以便定义的泛型优先于开放的泛型?
我有一个带有以下构造函数的Order类
public Order(IProduct product, short count)
{
this._product = product;
this._count = count;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试设置Unity IoC容器,显然要构建我需要知道计数和产品的订单对象,但这些是在运行时确定的; 计数可以是任何价值,产品可以是任何产品,例如胡萝卜,甜瓜等.
那么如何应用IoC呢?
我认为一种方法是我的构造函数只接受对象依赖,然后使用新的Initialize()方法添加任何其他必需的属性:
public Order (IProduct product)
{
this._product = product;
}
public Initialize(short count)
{
this._count = count;
}
Run Code Online (Sandbox Code Playgroud)
以这种方式创建Order对象的人必须在之后调用Initialize()方法,以便将IoC容器无法处理的其他属性添加到其中.
这是你推荐/使用的方法吗?
c# asp.net ioc-container inversion-of-control unity-container
我在这行代码上遇到错误:
using (IMaterialClient rawMaterialServiceProxy =
ServerUtility.Container.Resolve<IMaterialClient>())
Run Code Online (Sandbox Code Playgroud)
错误:
依赖关系的解析失败...当前类型Xxx是一个接口,无法构造.你错过了类型映射吗?
我没有注册具体的IMaterialClient.在我刚看过的Pluralsight视频中,他们说你不必注册所有类型,因为如果没有指定,Unity会找到一个实现.这改变了吗?我错过了什么吗?为什么不解决这个问题?运行此程序时,具有实际IMaterialClient实现的程序集位于bin文件夹中.
如何自动提取Fluently.自动配置与DB的连接?
我们的设置详述如下.
我们有以下静态方法来创建会话工厂:
public static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(
IfxOdbcConfiguration
.Informix
.ConnectionString("DSN=ODBCCONNECTION")
.Driver<CompanyCore.Nhibernate.Core.ProfiledODBCClientDriver>()
.Dialect<InformixDialect1000>()
.ShowSql()
)
.Mappings(
m => m.FluentMappings.AddFromAssemblyOf<Task>()
)
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
这与我们的IOC设置一起用于创建SessionFactory,但是,由于我们的数据库团队需要,每个用户必须打开他/她自己的连接作为他们的用户(使用非个性化) - 允许进程识别,看谁正在运行Informix服务器上的内容.
要创建我们使用的各个连接:
public static ISession GetMySession(ISessionFactory factory, string user)
{
CompanyCore.Nhibernate.Core.ProfiledODBCClientDriver drv = new Enact.Nhibernate.Core.ProfiledODBCClientDriver();
drv.Configure(new Dictionary<string, string>());
string conn = "DSN=ODBCCONNECTION";
IDbConnection db = drv.CreateConnection();
db.ConnectionString = conn;
db.Open();
return factory.OpenSession(db);
}
Run Code Online (Sandbox Code Playgroud)
当我们的UOW呼叫处理时,这些连接关闭.
我们调用CreateSessionFactory()APP Start然后通过IOC传递此工厂,但此时没有非个性化用户,因此在首次加载时会导致应用程序错误.
我们已经考虑过使用标准用户可以访问首次加载等内容,但肯定有更好的方法吗?
nhibernate informix inversion-of-control unity-container fluent-nhibernate
我有一个以nullable int为参数的类.
public class Test
{
public Test(int? p)
{
// ......
}
// ......
}
Run Code Online (Sandbox Code Playgroud)
如何使用unity解析它(将null作为参数传递)?
myContainer.RegisterType<Test>(new InjectionConstructor(10));
Run Code Online (Sandbox Code Playgroud)
这可以传递10作为值,但如果我传递null,它会抛出异常.
我是依赖注入模式的新手.关于一些事情,我有点困惑.
我有一个名为'MailCore'的类库项目.该项目具有执行所有电子邮件发送内容的接口和类.我有一个名为'The site'的MVC项目.它使用'MailCore'项目发送电子邮件.我在这个项目中有Unity,并且UnityContainer已经注册,并且工作正常.
我还有另一个名为"SiteRepo"的类库库项目.有时,为了执行某些特定任务,我必须从该项目发送电子邮件.因此,"MailCore"项目也在此项目中引用.
我在'SiteRepo'项目中从NuGet安装了Unity,它似乎没有在这个类库项目中创建任何UnityConfig.我如何在这里注册UnityContainer?
网站:
Public class JobController : Controller
{
private readonly IEmailBuilder mailBuilder;
public JobController(IEmailBuilder mailBuilder)
{
this.mailBuilder = mailBuilder;
}
public ActionResult Create(....)
{
JobRepo j = new JobRepo();
j.Create(....);
}
}
Run Code Online (Sandbox Code Playgroud)
UnityConfig(这是在网络应用程序'The Site'):
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
container.RegisterType<IEmailBuilder, EmailBuilder>(); …Run Code Online (Sandbox Code Playgroud) 越来越多的.NET Core库已绑定到IServiceCollection。在例子中,我想使用HttpClientFactory说明这里在我的.NET框架4.7.1。桌面应用程序。我的应用程序正在使用Unity IoC。我引用Microsoft.Extensions.Http为NuGet。
但是有一个问题:新的ASP.Net Core组件已绑定到.NetCore-的Microsoft DI框架IServiceCollection。例如,HttpClientFactory此处的注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
}
Run Code Online (Sandbox Code Playgroud)
我正在深入研究MS代码,并想手动向Unity注册相应的接口和类。这是IServiceCollection注册服务的方式:
services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
services.TryAddSingleton<IHttpClientFactory, DefaultHttpClientFactory>();
Run Code Online (Sandbox Code Playgroud)
将其移至Unity IoC不会有什么问题,但是当我要注册DefaultHttpMessageHandlerBuilder并且DefaultHttpClientFactory具有内部可见性时,我陷入了困境。因此,它们不可用于MS代码之外的注册。
我有机会解决这种情况吗?
unity-container ×10
c# ×6
.net ×2
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
generics ×1
informix ×1
mvvm ×1
nhibernate ×1
structuremap ×1