Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当提供者实现具有依赖性时,如何使用Unity with Provider模式_C#_Dependencies_Unity Container_Provider - Fatal编程技术网

C# 当提供者实现具有依赖性时,如何使用Unity with Provider模式

C# 当提供者实现具有依赖性时,如何使用Unity with Provider模式,c#,dependencies,unity-container,provider,C#,Dependencies,Unity Container,Provider,我用的是统一和统一 这是典型的提供者实现。我有SomeProvider作为抽象基础提供者,它具有抽象方法以及实例化defaultProvider的逻辑 public abstract class SomeProvider : ProviderBase { #region provider boilerplate private const string PROVIDER_NAME = "someProvider"; private static volatile Som

我用的是统一和统一

这是典型的提供者实现。我有
SomeProvider
作为抽象基础提供者,它具有抽象方法以及实例化
defaultProvider
的逻辑

public abstract class SomeProvider : ProviderBase
{
    #region provider boilerplate

    private const string PROVIDER_NAME = "someProvider";
    private static volatile SomeProvider defaultProvider = null;
    public static SomeProvider Provider
    {
        get { return defaultProvider; }
    }
    private static object providerLockObject = new object();
    static SomeProvider()
    {
        LoadProvider();
    }
    private static void LoadProvider()
    {
        if (defaultProvider == null)
        {
            lock (providerLockObject)
            {
                if (defaultProvider == null)
                {
                    // exception handling omitted for brevity
                    var section = ConfigurationManager.GetSection(PROVIDER_NAME)
                        as BaseProviderConfigurationSection;
                    defaultProvider = ProvidersHelper.InstantiateProvider(
                        section.Providers[section.DefaultProvider], typeof(SomeProvider)) as SomeProvider;
                }
            }
        }
    }

    protected SomeProvider() { }

    #endregion

    #region abstract methods

    public abstract bool DoSomething();

    #endregion
}
下面是实现
SomeProvider
ASomeProvider
。请注意,
ASomeProvider
具有依赖性
ADependency
,但
SomeProvider
没有

public class ASomeProvider : SomeProvider
{
    #region provider boilerplate

    private string name;
    public override string Name
    {
        get { return name; }
    }

    public override void Initialize(string name, NameValueCollection config)
    {
        this.name = name;
        base.Initialize(name, config);
    }

    #endregion

    // Provider pattern needs parameterless ctor and calls this
    public ASomeProvider() { }
    // constructor injection
    public ASomeProvider(ADependency aDependency)
    {
        this.ADependency = aDependency;
    }

    [Dependency]
    public SomeDependency ADependency { get; set; }

    #region methods

    public override void DoSomething()
    {
        // do something
    }

    #endregion
}

class SomeDependency {}
我在业务层中使用
ASomeProvider
,如下所示:

public class SomeBusinessLayer
{
    public SomeProvider someProvider;

    public SomeBusinessLayer(SomeProvider someProvider)
    {
        this.someProvider = someProvider;
    }

    #region methods
    public bool DoSomethingWrapper()
    {
        return someProvider.DoSomething();
    }
    #endregion
}
我有
BusinessLayerFactory
工厂,用于使用Unity连接对象并返回如下对象:

public static class BusinessLayerFactory
{
    private static UnityContainer container;

    private static void WireUp()
    {
        container = new UnityContainer();

        container.RegisterInstance(SomeProvider.Provider);
        container.RegisterInstance(new SomeDependency());
        container.RegisterType<SomeBusinessLayer>(new ContainerControlledLifetimeManager());
    }
    public static SomeBusinessLayer SomeBusinessLayer_Unity
    {
        get
        {
            return container.Resolve<SomeBusinessLayer>();
        }
    }
    public static SomeBusinessLayer SomeBusinessLayer_Self()
    {
        var asomeProvider = SomeProvider.Provider as ASomeProvider;
        if (asomeProvider != null && asomeProvider.ADependency == null)
            asomeProvider.ADependency = new ADependency();
        return new SomeBusinessLayer(SomeProvider.Provider);
    }
}
((ASomeProvider)someBusinessLayer.someProvider)。相关性
null

其原因是,提供程序模式使用helper方法
ProvidersHelper.InstanceProvider(ProviderSettings ProviderSettings,Type)
来实例化默认提供程序,而不是通过Unity的
Resolve()
方法

我可以想象在没有Unity的情况下这样做,如
SomeBusinessLayer\u Self
中所示,其中我新建了
a独立性
if
null
,但我只是想知道Unity是否以及如何处理这个问题

方法注射或Ctor注射由我决定

我如何解决这个问题,并让Unity和Provider模式一起工作?我使用Unity的主要原因是连接工厂中的对象

我没有使用MVC

更新:

要解决此问题:。帽尖

如果没有显式cast
container.build(aSomeProvider)
,我无法找到一种方法

container.RegisterInstance(新的SomeDependency());
//这不会建立具有依赖关系的对象
容器.Provider(SomeProvider.Provider);
//这是有效的,而且确实会累积
var aSomeProvider=SomeProvider.Provider作为aSomeProvider;
if(aSomeProvider!=null)
容器组分(ASOME供应商);
//编译错误
容器.Provider(SomeProvider.Provider);
container.RegisterInstance(SomeProvider.Provider);
RegisterType(新的ContainerControlledLifetimeManager());
您不能在
BusinessLayerFactory.WireUp
方法中使用,以充实对
SomeProvider.Provider
实例的依赖关系吗?您的对象仍将通过提供者实现构建,但将通过unity进行依赖注入

例如:

private static void WireUp()
{
    container = new UnityContainer();

    container.RegisterInstance(SomeProvider.Provider);
    container.RegisterInstance(new SomeDependency());
    container.RegisterType<SomeBusinessLayer>(
        new ContainerControlledLifetimeManager());

    container.BuildUp<ASomeProvider>(SomeProvider.Provider as ASomeProvider);
}
private static void WireUp()
{
容器=新的UnityContainer();
container.RegisterInstance(SomeProvider.Provider);
RegisterInstance(新的SomeDependency());
container.RegisterType(
新的ContainerControlled LifetimeManager());
容器。请说明以下内容:

当您不控制对象的构造时,此方法非常有用 实例(例如,通过XAML创建的ASP.NET页面或对象),但 您仍然希望执行属性和其他注入

您不能在
BusinessLayerFactory.WireUp
方法中使用,以充实对
SomeProvider.Provider
实例的依赖关系吗?您的对象仍将通过提供程序实现进行构造,但将通过unity进行依赖关系注入

例如:

private static void WireUp()
{
    container = new UnityContainer();

    container.RegisterInstance(SomeProvider.Provider);
    container.RegisterInstance(new SomeDependency());
    container.RegisterType<SomeBusinessLayer>(
        new ContainerControlledLifetimeManager());

    container.BuildUp<ASomeProvider>(SomeProvider.Provider as ASomeProvider);
}
private static void WireUp()
{
容器=新的UnityContainer();
container.RegisterInstance(SomeProvider.Provider);
RegisterInstance(新的SomeDependency());
container.RegisterType(
新的ContainerControlled LifetimeManager());
容器。请说明以下内容:

当您不控制对象的构造时,此方法非常有用 实例(例如,通过XAML创建的ASP.NET页面或对象),但 您仍然希望执行属性和其他注入


链接的文章没有说明您需要一个公共的无参数构造函数。删除该不需要的构造函数将使您无需配置Unity来解析特定的InjectedConstructor@Tejs,
ProvidersHelper.InstanceProvider(设置,类型)
方法需要一个无参数构造函数,否则会引发一个异常。在注释的第二部分中不清楚您的意思。有没有示例?链接的文章没有说明您需要一个公共的无参数构造函数。删除该不需要的构造函数将使您无需配置Unity来解析特定的InjectedConstructor。@Tejs,
ProViderHelper.InstanceProvider(设置,类型)
方法需要一个无参数的ctor,否则会引发一个异常。在注释的第二部分中不清楚您的意思。有没有示例?
build
确实帮助我解决了这个问题。我正在更新这个问题。我不知道是否有更好的方法。哎哟-我在胡闹:)。更新了答案。找到了更好的方法。我摆脱了
Provider
模式并完全使用了
Unity
。由于
Unity
管理对象的创建,因此我不必使用
Building
方法。这也行得通……我只是认为您出于某种原因需要该对象的Provider模式。
Building
确实帮助我解决了问题。我正在更新问题n、 我不知道是否有更好的方法。哎哟-我在胡说:)。更新了答案。找到了更好的方法。我摆脱了
提供者
模式,完全使用了
Unity
。由于
Unity
管理对象的创建,我不必使用
build
方法。这也很有效……我刚刚想到你了出于某种原因,需要该对象的提供程序模式。
private static void WireUp()
{
    container = new UnityContainer();

    container.RegisterInstance(SomeProvider.Provider);
    container.RegisterInstance(new SomeDependency());
    container.RegisterType<SomeBusinessLayer>(
        new ContainerControlledLifetimeManager());

    container.BuildUp<ASomeProvider>(SomeProvider.Provider as ASomeProvider);
}