繁体   English   中英

MAF(System.AddIn)属性是一个集合

[英]MAF (System.AddIn) Property which is a Collection

我正在尝试使用.NET4 System.AddIn命名空间编写MAF AddIn。 AddIn具有一个属性,该属性是称为“ ReportParameters”的自定义类型的集合。 AddIn上还有其他属性,它们是mscorlib中包含的本机类型(即:int,bool,字符串等),我在下面的代码段中省略了这些属性,因为它们可以正常工作。 我在将ReportParameters IListContract转换为IList以及反之亦然的Host和AddIn侧适配器方面苦苦挣扎。 任何帮助,将不胜感激。 我的管道当前定义如下(请参阅主机适配器中的注释):

合同组装

[AddInContract]
public interface IReportComponentContract: IContract
{
    IListContract<IReportParameterContract> ReportParameters { get; set; }
    bool GenerateReport();
}

public interface IReportParameterContract: IContract
{
    string Name { get; set; }
    string Value { get; set; }
}

加载项视图程序集

[AddInBase]
public interface IReportComponent
{
    IList<IReportParameter> ReportParameters { get; set;}
    bool GenerateReport();
}

public interface IReportParameter
{
    string Name { get; set; }
    string Value { get; set; }
}

public class ReportParameter : IReportParameter
{
    public string Name
    {
        get;
        set;
    }

    public string Value
    {
        get;
        set;
    }
}

插件主机适配器程序集

[AddInAdapter]
public class ReportComponentViewToContractAddInAdapter: ContractBase, IReportComponentContract
{
    IReportComponent_view;

    public ReportComponentViewToContractAddInAdapter(IReportComponent view)
    { 
        _view = view;
    }

    public IListContract<IReportParameterContract> ReportParameters
    {
        get
        {
            return CollectionAdapters.ToIListContract<IReportParameter, IReportParameterContract>(_view.ReportParameters, ReportParameterAddInAdapter.ViewToContractAdapter, ReportParameterAddInAdapter.ContractToViewAdapter); 
        }
        set
        {
            _view.ReportParameters = CollectionAdapters.ToIList<IReportParameterContract, IReportParameter>(value, ReportParameterAddInAdapter.ContractToViewAdapter, ReportParameterAddInAdapter.ViewToContractAdapter); 
        }
    }

    public bool GenerateReport()
    {
        return _view.GenerateReport();
    }

    internal IReportComponent GetSourceView()
    {
        return _view;
    }
}

public class ReportParameterAddInAdapter
{
    internal static IReportParameter ContractToViewAdapter(IReportParameterContract contract)
    {
        if (!System.Runtime.Remoting.RemotingServices.IsObjectOutOfAppDomain(contract) &&
            (contract.GetType().Equals(typeof(ReportParameterViewToContractAddInAdapter))))
        {
            return ((ReportParameterViewToContractAddInAdapter)(contract)).GetSourceView();
        }
        else
        {
            return new ReportParameterContractToViewAddInAdapter(contract);
        }
    }

    internal static IReportParameterContract ViewToContractAdapter(IReportParameter view)
    {
        if (!System.Runtime.Remoting.RemotingServices.IsObjectOutOfAppDomain(view) &&
            (view.GetType().Equals(typeof(ReportParameterContractToViewAddInAdapter))))
        {
            return ((ReportParameterContractToViewAddInAdapter)(view)).GetSourceContract();
        }
        else
        {
            return new ReportParameterViewToContractAddInAdapter(view);
        }
    }
}

public class ReportParameterContractToViewAddInAdapter : IReportParameter
{
    private IReportParameterContract _contract;
    private ContractHandle _handle;

    public ReportParameterContractToViewAddInAdapter(IReportParameterContract contract)
    {
        _contract = contract;
        _handle = new ContractHandle(contract);
    }

    public string Name 
    { 
        get { return _contract.Name; }
        set { _contract.Name = value; }
    }

    public string Value 
    { 
        get { return _contract.Value;}
        set { _contract.Value = value; } 
    }

    internal IReportParameterContract GetSourceContract()
    {
        return _contract;
    }
}

public class ReportParameterViewToContractAddInAdapter : ContractBase, IReportParameterContract
{
    IReportParameter _view;

    public ReportParameterViewToContractAddInAdapter(IReportParameter view)
    {
        _view = view;
    }

    public virtual string Name
    { 
        get { return _view.Name; }
        set { _view.Name = value; }
    }

    public virtual string Value
    { 
        get { return _view.Value; }
        set { _view.Name = value; }
    }

    internal IReportParameter GetSourceView()
    {
        return _view;
    }
}

主机视图装配

public interface IReportComponent
{
    IList<IReportParameter> ReportParameters { get; set; }
    bool GenerateReport();
}

public interface IReportParameter
{
    string Name { get; set; }
    string Value { get; set; }
}

public class ReportParameter : IReportParameter
{
    public string Name
    {
        get;
        set;
    }

    public string Value
    {
        get;
        set;
    }
}

主机适配器组件

[HostAdapter]
public class ReportComponentContractToViewHostAdapter: IReportComponent
{
    IReportComponentContract _contract;
    ContractHandle _lifetime;

    public ReportComponentContractToViewHostAdapter(IReportComponent contract)
    {
        _contract = contract;
        _lifetime = new ContractHandle(contract);
    }

    public IList<IReportParameter> ReportParameters
    {
        get 
        {
            return CollectionAdapters.ToIList<IReportParameterContract, IReportParameter>(_contract.ReportParameters, ReportParameterHostAdapter.ContractToViewAdapter, ReportParameterHostAdapter.ViewToContractAdapter); 
        }
        set 
        {
            _contract.ReportParameters = CollectionAdapters.ToIListContract<IReportParameter, IReportParameterContract>(value, ReportParameterHostAdapter.ViewToContractAdapter, ReportParameterHostAdapter.ContractToViewAdapter); 
        }
    }

    public  bool GenerateReport()
    {
        return _contract.GenerateReport();
    }

}

internal class ReportParameterContractToViewHostAdapter : IReportParameter
{
    private ContractHandle _handle;
    private IReportParameterContract _contract;

    public ReportParameterContractToViewHostAdapter(IReportParameterContract contract)
    {
        _contract = contract;
        _handle = new ContractHandle(contract);
    }

    public string Name
    {
        get { return _contract.Name; }
        set { _contract.Name = value; }
    }

    public string Value
    {
        get { return _contract.Value; }
        set { _contract.Value = value; }
    }

    internal IReportParameterContract GetSourceContract()
    {
        return _contract;
    }
}

public class ReportParameterHostAdapter
{
    internal static IReportParameter ContractToViewAdapter(IReportParameterContract contract)
    {
        if (!System.Runtime.Remoting.RemotingServices.IsObjectOutOfAppDomain(contract) &&
            (contract.GetType().Equals(typeof(ReportParameterViewToContractHostAdapter))))
        {
            return ((ReportParameterViewToContractHostAdapter)(contract)).GetSourceView();
        }
        else
        {
            return new ReportParameterContractToViewHostAdapter(contract);
        }
    }

    internal static IReportParameterContract ViewToContractAdapter(IReportParameter view)
    {
        if (!System.Runtime.Remoting.RemotingServices.IsObjectOutOfAppDomain(view) &&
            (view.GetType().Equals(typeof(ReportParameterContractToViewHostAdapter))))
        {
            return ((ReportParameterContractToViewHostAdapter)(view)).GetSourceContract();
        }
        else
        {
            return new ReportParameterViewToContractHostAdapter(view);
        }

    }
}

public class ReportParameterViewToContractHostAdapter: ContractBase, IReportParameterContract
{
    private IReportParameter _view;

    public ReportParameterViewToContractHostAdapter(IReportParameter view)
    {
        _view = view;
    }

    public virtual string Name
    {
        get { return _view.Name; }
        set { _view.Name = value; }
    }

    public virtual string Value
    {
        get { return _view.Value; }
        set { _view.Value = value; }
    }

    internal IReportParameter GetSourceView()
    {
        return _view;
    }
}

通过遵循 MSDN演练中讨论的示例,我能够自己弄清楚这一点 基本上,在上面的代码示例中,方程式只有一半。 在AddView适配器和HostView适配器中,都需要从视图转换为合同,并且需要将视图转换为给定报告参数的合同。 我已经更新了问题中的代码示例,以便希望其他人有此需要时可以节省一些时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM