标签: unity-container

如何松散地引用Prism中的模块以便它们能够存在还是不存在?

这个stackoverflow问题中,我了解到Prism/Unity并没有像我想象的那样解耦,例如,如果我有这个类将menuManager注入到它的构造函数中,那么我必须确保这个类实际存在于某个地方(我认为你可以只需拉出包含类的.dll,容器就会处理它,例如在其位置注入null):

public class EmployeesPresenter
{
    public EmployeesPresenter(IMenuManager menuManager)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

但是我可以解决这个问题:应用程序无法在没有MenuModule的情况下运行(或者根据建议我可以使用NullMenuModule,它只会阻止应用程序中断).

但是,我正在构建的应用程序将在MenuModule中有一个MenuManager类,并且每个模块都必须使用MenuManager在菜单中注册它想要的所有内容.但是,我希望能够换出MenuModule,例如有一个InfragisticsMenuModule,并有一个TelerikMenuModule等.

但是,当我在例如CustomersModule中时,为了使用TelerikMenuModule,我需要引用它.当我想使用InfragisticsMenuModule时,我需要引用它.

那么我如何能够与InfragisticsMenuModule"热交换"TelerikMenuModule而无需使用新引用重新编译所有模块,例如我想要替换它:

Application.exe
Customers.dll
TelerikMenuModule.dll
Run Code Online (Sandbox Code Playgroud)

有了这个:

Application.exe
Customers.dll
InfragisticsMenuModule.dll
Run Code Online (Sandbox Code Playgroud)

并且只需能够重新启动应用程序并使用新的InfragisticsMenuModule.dll运行,并且不会抱怨TelerikMenuModule.dll不再存在.

wpf containers prism inversion-of-control unity-container

2
推荐指数
1
解决办法
1186
查看次数

使用Unity IoC容器解决C#中的包装类

我想将Unity解析IService用于两个不同的实现,以使用包装类,相当于:

 IService service = new DispatcherService(new RealService(), Application.Current.Dispatcher);
Run Code Online (Sandbox Code Playgroud)

两者兼顾DispatcherServiceRealService实现IService界面.

我有一个包含一些异步操作服务的库.此服务的简化形式如下所示:

public interface IService
{
    IAsyncResult StartSomeOperation();
    event EventHandler<EventArgs> SomeOperationCompleted;
}
Run Code Online (Sandbox Code Playgroud)

我有所有这些服务的实现.我希望这个库保持对WPF和IoC容器的依赖性,但是在IoC容器和可能的WPF正在使用的情况下,它可以最好地使用.

我有一个使用Unity IoC容器的WPF Ui.最常见的重复代码围绕已完成的处理程序 - 需要使用Dispatcher将它们编组回UI线程.所以我正在考虑一个包装器,像这样:

using System;
using System.Windows.Threading;

public class DispatcherService : IService
{
    private Dispatcher dispatcher;
    private IService wrappedService;

    public DispatcherService(IService wrappedService, Dispatcher dispatcher)
    {
        this.wrappedService = wrappedService;
        this.wrappedService.SomeOperationCompleted += this.OnWrappedOperationCompleted;
        this.dispatcher = dispatcher;
    }

    public IAsyncResult StartSomeOperation()
    {
        return this.wrappedService.StartSomeOperation();
    }

    public event EventHandler<EventArgs> SomeOperationCompleted;

    private void OnWrappedOperationCompleted(object …
Run Code Online (Sandbox Code Playgroud)

c# ioc-container unity-container wrapper

2
推荐指数
1
解决办法
4374
查看次数

Unity/EntLib:将依赖项注入CustomTraceListener

对不起,这是一个非常特殊的主题,所以这可能不是很多人感兴趣的.:-(

但是,我需要做以下事情:

  • 我有一个应用程序,它提供了某种控制台窗口的日志记录(它是一个WPF窗口,因为应用程序需求,因为应用程序需要看起来华而不实 - 我们的特殊客户要求并在每次我们见面时讨论它)

  • 为了提供与线程无关的日志记录,我创建了一个接口/实现对"IGUIController"/"GUIController"

到现在为止还挺好.一切都很好.

然而:

  • 我需要我自己的自定义跟踪侦听器(我称之为"GUITraceListener"),它使用IGUIController接口将特定的日志消息写入那个华而不实的WPF​​窗口

到目前为止,我的解决方案是让一个黑客,旧的skool代码闻到单身式 - 风格"当前" - 我的GUIController属性(是的,我很惭愧,我知道这很糟糕),我这样调用:

GUIController.Current.Log(message);
Run Code Online (Sandbox Code Playgroud)

显然,这是一个禁忌.

因此,正确的方法是注入依赖(当然).但是,当我这样做时,我得到了投诉(运行时),我没有为我的GUITraceListener类提供0(零)参数的构造函数.

事实上,我在这里得到:

EnterpriseLibraryContainer.ConfigureContainer(configurator, 
ConfigurationSourceFactory.Create());
Run Code Online (Sandbox Code Playgroud)

投诉是:

ArgumentException未处理无法为GUITraceListener找到合适的0参数构造函数

这真的很糟糕.我的意思是,Unity是企业库的一部分,为什么这些人不会简单地添加注入我的依赖项的可能性?

澄清:

我最终想要的是:

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="guiController"></param>
    public GUITraceListener(IGUIController guiController)
    {
        // Store the dependencies
        this.m_GUIController = guiController;
    }
Run Code Online (Sandbox Code Playgroud)

enterprise-library ioc-container unity-container

2
推荐指数
1
解决办法
1930
查看次数

ASP.NET 4.0中的代码访问安全性和动态数据错误

我的MVC c#项目有些问题.

首先,我收到此错误:级别2透明度导致AllowPartiallyTrustedCallers程序集中的所有方法默认情况下变为透明安全,这可能是此异常的原因.完成:

试图通过安全透明方法 'System.Runtime.Diagnostics.DiagnosticTrace..ctor(System.String,的System.Guid)' 来访问安全临界方法"System.Runtime.Diagnostics.EtwDiagnosticTrace..ctor(System.String,的System.Guid )'失败了.

大会"System.ServiceModel.Internals,版本= 4.0.0.0,文化=中性公钥= 31bf3856ad364e35"标有AllowPartiallyTrustedCallersAttribute程序,并使用2级安全透明度模式.2级透明度导致AllowPartiallyTrustedCallers程序集中的所有方法默认情况下变为透明,这可能是导致此异常的原因.

因此,我在互联网上搜索,找到了解决它的两种可能性.第一部分将此代码段包含在assemblyinfo.cs:

[assembly: System.Security.AllowPartiallyTrustedCallers]
Run Code Online (Sandbox Code Playgroud)

但没有改变..

谷歌搜索我发现第二个信息说,如果我放入web.config它可能工作.

<trust legacyCasModel="true" level="Full" />
Run Code Online (Sandbox Code Playgroud)

但是,当我把信息放在web.config我接收和错误之类的时候

动态操作只能在同源AppDomain中执行

我不知道还有什么需要做的......

我相信使用microsoft.practices.unity与ASP.NET 4.0和mvc 4,是问题的主要原因.但根据我的应用程序的工作方式,我必须使用unity.

brgds!塞巴斯蒂安.

c# asp.net-mvc unity-container

2
推荐指数
1
解决办法
3039
查看次数

Microsoft Unity界面拦截和构造函数注入之间的区别

asp.net unity中的接口拦截和构造函数注入有什么区别?我缺乏对Unity的理解我正在研究一个旧项目和unity.config,有些像这样,

<register type="ICRIC2012TrialUserService" mapTo="CRIC2012TrialUserService">
        <lifetime type="perthread"/>
        <interceptor type="InterfaceInterceptor"/>
        <policyInjection/>
</register>
Run Code Online (Sandbox Code Playgroud)

但有些人没有

<interceptor type="InterfaceInterceptor"/>
Run Code Online (Sandbox Code Playgroud)

但是在项目中,这些类和接口以相同的方式工作,就像这样

private readonly IIncomingEstimateService _incomingEstimateService;

        public ContractService(IIncomingEstimateService incomingEstimateService)
        {
            _incomingEstimateService = incomingEstimateService;
        }
Run Code Online (Sandbox Code Playgroud)

c# unity-container code-injection unity-interception

2
推荐指数
1
解决办法
2268
查看次数

让数据库连接打开?

我的Web应用程序具有以下类:

public class DatabaseProvider {
    private readonly IDbConnection _cn;

    public DatabaseProvider(IDbConnection cn) {
        _cn = cn;
    }

    public void ExecuteNonQuery(string query) {
        // Execute the query
        var cmd = _cn.CreateCommand();
        cmd.CommandText = query;
        cmd.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码声明IDbConnection依赖项(使用Microsoft Unity):

container.RegisterType<IDbConnection>(new InjectionFactory(c => {
    var cn = new SqlConnection("...");
    cn.Open();
    return cn;
}));
Run Code Online (Sandbox Code Playgroud)

这允许我将连接换成SQLite,如下所示:

container.RegisterType<IDbConnection>(new InjectionFactory(c => {
    var cn = new SQLiteConnection("Data Source=:memory:;Version=3;");
    cn.Open();
    return cn;
}));
Run Code Online (Sandbox Code Playgroud)

我在测试时使用SQLite,连接必须保持打开,否则数据会丢失.因此,我不能在需要时打开和关闭连接.

我总是在需要时打开与数据库的连接,并想知道这是否可以扩展到大型应用程序?

我很感激有关如何改进的建议.谢谢

c# sql-server sqlite unit-testing unity-container

2
推荐指数
1
解决办法
1543
查看次数

如何在使用Unity IoC时实现Ninject .InSingletonScope()

我在我的应用程序中使用了ninject IoC,特别是以下内容:

kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
   .InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

我想使用Unity IoC实现这一点,但是有人可以告诉我如何使它成为同样的,它的含义是什么"InSingletonScope()"?以下工作,但我担心它没有正确完成,因为可能需要指定Singleton.

container.RegisterType<RepositoryFactories, RepositoryFactories>();
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc ninject unity-container

2
推荐指数
1
解决办法
1467
查看次数

Unity InjectionConstructor传递对象数组

我正在尝试使用unity注册依赖项并将值传递给构造函数,使用下面的代码

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(new Pharmacy {SiteId = 2,DistrictCode = "2"}));
Run Code Online (Sandbox Code Playgroud)

但我越来越

“类型OrderService.Business.MockOrderServiceProviderContext没有采用参数(Pharmacy)的构造函数。”

构造函数。

public MockOrderServiceProviderContext(params object[] objects)
     {
         _object = objects;
     }
Run Code Online (Sandbox Code Playgroud)

如何传递对象数组的构造函数值?

谢谢

dependency-injection unity-container

2
推荐指数
1
解决办法
1532
查看次数

使用ASP.NET MVC 4应用程序实例化Unity命名类型注册

我想了解如何解决MVC4应用程序中的统一命名类型注册。

我正在使用“ Unity 3.0”和“ ASP.NET MVC的Unity Boostrapper”。

我了解到Unity已在DependencyResolver中注册,因此我可以使用依赖项解析器方法来获取已注册类型的实例。

当我想找回简单的注册时,此方法很好用。

例如

//Registration
container.RegisterType<IFootballer, VanPersey>();

//Instantiation 
var footballer1 = DependencyResolver.Current.GetService<IFootballer>();
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下,当我想获取对命名类型注册的引用时,似乎IDependencyResolver接口没有提供适当的方法来获取命名类型注册实例。

如果我可以直接访问unity容器,则可以执行以下操作:

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为了获得命名注册的实例,在MVC应用程序中使用unity的最合适方法是什么。即可以进入统一容器吗?

请注意,此问题不适用于任何生产实现,我正在研究Unity(以及首次使用IoC容器)并希望获得更好的理解。

我了解在生产中,我很可能会通过控制器构造函数传递依赖关系,这实际上使我想到了另一个问题。

在以下示例中,使用控制器构造函数注入时,如何指示要解析的命名类型:

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
public HomeController(IFootballer footballer)
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc ioc-container inversion-of-control unity-container

2
推荐指数
1
解决办法
5035
查看次数

使用Unity注入构造函数参数

假设我有一个名为的接口IBlabla及其实现Blabla,如下所示:

public class Blabla : IBlabla
{
    Blabla(string endPoint) { }
}
Run Code Online (Sandbox Code Playgroud)

使用StructureMap,我可以轻松地将一个参数注入我的构造函数参数,如下所示:

For<IBlabla>().Singleton().Use(() => new Blabla("myBinding"));
Run Code Online (Sandbox Code Playgroud)

我怎么能用这个来实现Unity呢?

我已经尝试过这一切:

container.RegisterType<IBlabla>(new HierarchicalLifetimeManager(), new InjectionFactory((x, t, c) => new Blabla("myBinding")));
container.RegisterType<IBlabla, Blabla>(new InjectionConstructor(new ResolvedParameter<string>("myBinding")));
Run Code Online (Sandbox Code Playgroud)

但它们都不适合我.

.net c# dependency-injection inversion-of-control unity-container

2
推荐指数
1
解决办法
1297
查看次数