Question

I am attempting to write a MAF AddIn using the .NET4 System.AddIn namespaces. The AddIn has a property that is a collection of a custom type called 'ReportParameters'; there are other properties on the AddIn which are native types contained in mscorlib (ie: ints, bools, strings, etc) that I have ommited from the code snippets below because they work fine. I am struggling with the Host and AddIn side adapters that convert ReportParameters IListContract to an IList and vice versa. Any help would be appreciated. My pipeline is currently defined as follows (see comments in Host Adapter):

Contract Assembly

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

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

AddIn View Assembly

[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;
    }
}

AddIn Host Adapter Assembly

[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;
    }
}

Host View Assembly

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;
    }
}

Host Adapter Assembly

[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;
    }
}
Was it helpful?

Solution

I was able to figure this out on my own by following the example discussed in this MSDN walkthrough. Basically, I only had one half of the equation in the code sample above. In both the AddView Adapter and HostView adapater, you need to do the conversion to a contract from a view and from a view to a contract for a given report parameter. I have updated the code sample in the question so that hopefully it spares someone else some time should they have this need.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top